Make Task debugging more pleasant
authorMarek Safar <marek.safar@gmail.com>
Thu, 1 Sep 2011 12:20:47 +0000 (13:20 +0100)
committerMarek Safar <marek.safar@gmail.com>
Thu, 1 Sep 2011 12:26:50 +0000 (13:26 +0100)
mcs/class/corlib/System.Threading.Tasks/Task.cs
mcs/class/corlib/System.Threading.Tasks/TaskDebuggerView.cs [new file with mode: 0644]
mcs/class/corlib/System.Threading.Tasks/Task_T.cs
mcs/class/corlib/corlib.dll.sources

index d6bb6937e16bd9f796a1ce67ffba0a0c50698d21..f74466e5270a383c89b43ceb35d30dfee81c3842 100644 (file)
@@ -30,8 +30,8 @@ using System.Collections.Concurrent;
 
 namespace System.Threading.Tasks
 {
-       [System.Diagnostics.DebuggerDisplay ("Id = {Id}, Status = {Status}, Method = {DisplayActionMethod}")]
-//     [System.Diagnostics.DebuggerTypeProxy ("System.Threading.Tasks.SystemThreadingTasks_TaskDebugView")]
+       [System.Diagnostics.DebuggerDisplay ("Id = {Id}, Status = {Status}")]
+       [System.Diagnostics.DebuggerTypeProxy (typeof (TaskDebuggerView))]
        public class Task : IDisposable, IAsyncResult
        {
                // With this attribute each thread has its own value so that it's correct for our Schedule code
@@ -179,6 +179,9 @@ namespace System.Threading.Tasks
                
                public void RunSynchronously (TaskScheduler scheduler)
                {
+                       if (scheduler == null)
+                               throw new ArgumentNullException ("scheduler");
+
                        if (Status > TaskStatus.WaitingForActivation)
                                throw new InvalidOperationException ("The task is not in a valid state to be started");
 
@@ -891,7 +894,7 @@ namespace System.Threading.Tasks
                        }
                }
                
-               string DisplayActionMethod {
+               internal string DisplayActionMethod {
                        get {
                                Delegate d = simpleAction ?? (Delegate) action;
                                return d == null ? "<none>" : d.Method.ToString ();
diff --git a/mcs/class/corlib/System.Threading.Tasks/TaskDebuggerView.cs b/mcs/class/corlib/System.Threading.Tasks/TaskDebuggerView.cs
new file mode 100644 (file)
index 0000000..4b4413e
--- /dev/null
@@ -0,0 +1,86 @@
+//
+// TaskDebuggerView.cs
+//
+// Authors:
+//     Marek Safar  <marek.safar@gmail.com>
+//
+// Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_4_0 || MOBILE
+
+using System;
+using System.Diagnostics;
+
+namespace System.Threading.Tasks
+{
+       //
+       // Custom debugger type proxy for tasks
+       //
+       sealed class TaskDebuggerView
+       {
+               readonly Task task;
+               
+               public TaskDebuggerView (Task task)
+               {
+                       this.task = task;
+               }
+               
+               public object AsyncState {
+                       get {
+                               return task.AsyncState;
+                       }
+               }
+               
+               public TaskCreationOptions CreationOptions {
+                       get {
+                               return task.CreationOptions;
+                       }
+               }
+               
+               public Exception Exception {
+                       get {
+                               return task.Exception;
+                       }
+               }
+               
+               public int Id {
+                       get {
+                               return task.Id;
+                       }
+               }
+               
+               public string Method {
+                       get {
+                               return task.DisplayActionMethod;
+                       }
+               }
+               
+               public TaskStatus Status {
+                       get {
+                               return task.Status;
+                       }
+               }
+       }
+}
+
+#endif
\ No newline at end of file
index 2f62212dffb920699e97325ab06a7a46ff4faf1f..3b8265953f9b3346d3a36daf90575dbdc959e4d3 100644 (file)
@@ -28,15 +28,15 @@ using System;
 
 namespace System.Threading.Tasks
 {
-       [System.Diagnostics.DebuggerDisplay ("Id = {Id}, Status = {Status}, Method = {DebuggerDisplayMethodDescription}, Result = {DebuggerDisplayResultDescription}")]
-       [System.Diagnostics.DebuggerTypeProxy ("System.Threading.Tasks.SystemThreadingTasks_FutureDebugView`1")]
+       [System.Diagnostics.DebuggerDisplay ("Id = {Id}, Status = {Status}, Result = {ResultAsString}")]
+       [System.Diagnostics.DebuggerTypeProxy (typeof (TaskDebuggerView))]
        public class Task<TResult>: Task
        {
                TResult value;
                static TaskFactory<TResult> factory = new TaskFactory<TResult> ();
                static readonly Action<object> emptyAction = delegate {};
                
-               Func<object, TResult> function;
+               internal Func<object, TResult> function;
                object state;
                
                [System.Diagnostics.DebuggerBrowsable (System.Diagnostics.DebuggerBrowsableState.Never)]
@@ -52,6 +52,15 @@ namespace System.Threading.Tasks
                                this.value = value;
                        }
                }
+
+               string ResultAsString {
+                       get {
+                               if ((Status & (TaskStatus.RanToCompletion)) != 0)
+                                       return "" + value;
+                               
+                               return "<value not available>";
+                       }
+               }
                
                public static new TaskFactory<TResult> Factory {
                        get {
index 51c5a34433249cf780552de5ff6e80e8e0abcfc9..89c004c90922e57bf3458676a474d6e15fcf87df 100644 (file)
@@ -1544,6 +1544,7 @@ System.Threading.Tasks/TaskContinuationOptions.cs
 System.Threading.Tasks/TaskCanceledException.cs
 System.Threading.Tasks/Task_T.cs
 System.Threading.Tasks/Task.cs
+System.Threading.Tasks/TaskDebuggerView.cs
 System.Threading.Tasks/TaskCompletionSource.cs
 System.Threading.Tasks/TaskSchedulerException.cs
 System.Collections.Concurrent/OrderablePartitioner.cs