Merge branch 'master' into msbuilddll2
[mono.git] / mcs / class / corlib / System.Threading.Tasks / TaskActionInvoker.cs
index a6a47a41c17ddc3648bf0a5a46b198f7987c671f..72a486f7a806e066243703865ad460e7b17d9404 100644 (file)
 //
 //
 
-#if NET_4_0 || MOBILE
+#if NET_4_0
+
+using System.Threading;
 
 namespace System.Threading.Tasks
 {
        abstract class TaskActionInvoker
        {
                public static readonly TaskActionInvoker Empty = new EmptyTaskActionInvoker ();
+               public static readonly TaskActionInvoker Promise = new EmptyTaskActionInvoker ();
+               public static readonly TaskActionInvoker Delay = new DelayTaskInvoker ();
                
                sealed class EmptyTaskActionInvoker : TaskActionInvoker
                {
@@ -129,6 +133,7 @@ namespace System.Threading.Tasks
 
                        public override void Invoke (Task owner, object state, Task context)
                        {
+                               owner.TrySetExceptionObserved ();
                                action (tasks);
                        }
                }
@@ -199,12 +204,10 @@ namespace System.Threading.Tasks
                sealed class ActionTaskSelected : TaskActionInvoker
                {
                        readonly Action<Task> action;
-                       readonly Task[] tasks;
 
-                       public ActionTaskSelected (Action<Task> action, Task[] tasks)
+                       public ActionTaskSelected (Action<Task> action)
                        {
                                this.action = action;
-                               this.tasks = tasks;
                        }
 
                        public override Delegate Action {
@@ -215,8 +218,7 @@ namespace System.Threading.Tasks
 
                        public override void Invoke (Task owner, object state, Task context)
                        {
-                               var result = ((Task<int>) owner).Result;
-                               action (tasks [result]);
+                               action (((Task<Task>)owner).Result);
                        }
                }
 
@@ -281,6 +283,7 @@ namespace System.Threading.Tasks
 
                        public override void Invoke (Task owner, object state, Task context)
                        {
+                               owner.TrySetExceptionObserved ();
                                ((Task<TResult>) context).Result = action (tasks);
                        }
                }
@@ -288,12 +291,10 @@ namespace System.Threading.Tasks
                sealed class FuncTaskSelected<TResult> : TaskActionInvoker
                {
                        readonly Func<Task, TResult> action;
-                       readonly Task[] tasks;
 
-                       public FuncTaskSelected (Func<Task, TResult> action, Task[] tasks)
+                       public FuncTaskSelected (Func<Task, TResult> action)
                        {
                                this.action = action;
-                               this.tasks = tasks;
                        }
 
                        public override Delegate Action {
@@ -304,8 +305,8 @@ namespace System.Threading.Tasks
 
                        public override void Invoke (Task owner, object state, Task context)
                        {
-                               var result = ((Task<int>) owner).Result;
-                               ((Task<TResult>) context).Result = action (tasks[result]);
+                               var result = ((Task<Task>) owner).Result;
+                               ((Task<TResult>) context).Result = action (result);
                        }
                }
 
@@ -393,6 +394,22 @@ namespace System.Threading.Tasks
                        }
                }
 
+               sealed class DelayTaskInvoker : TaskActionInvoker
+               {
+                       public override Delegate Action {
+                               get {
+                                       return null;
+                               }
+                       }
+
+                       public override void Invoke (Task owner, object state, Task context)
+                       {
+                               var mre = new ManualResetEventSlim ();
+                               int timeout = (int) state;
+                               mre.Wait (timeout, context.CancellationToken);
+                       }
+               }
+
                public static TaskActionInvoker Create (Action action)
                {
                        return new ActionInvoke (action);
@@ -453,6 +470,8 @@ namespace System.Threading.Tasks
                        return new FuncTaskObjectInvoke<TResult, TNewResult> (action);
                }
 
+               #region Used by ContinueWhenAll
+
                public static TaskActionInvoker Create (Action<Task[]> action, Task[] tasks)
                {
                        return new ActionTasksInvoke (action, tasks);
@@ -463,16 +482,18 @@ namespace System.Threading.Tasks
                        return new FuncTasksInvoke<TResult> (action, tasks);
                }
 
-               #region Used by WhenAny
+               #endregion
+
+               #region Used by ContinueWhenAny
 
-               public static TaskActionInvoker Create (Action<Task> action, Task[] tasks)
+               public static TaskActionInvoker CreateSelected (Action<Task> action)
                {
-                       return new ActionTaskSelected (action, tasks);
+                       return new ActionTaskSelected (action);
                }
 
-               public static TaskActionInvoker Create<TResult> (Func<Task, TResult> action, Task[] tasks)
+               public static TaskActionInvoker CreateSelected<TResult> (Func<Task, TResult> action)
                {
-                       return new FuncTaskSelected<TResult> (action, tasks);
+                       return new FuncTaskSelected<TResult> (action);
                }
 
                #endregion