//
//
-#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
{
public override void Invoke (Task owner, object state, Task context)
{
+ owner.TrySetExceptionObserved ();
action (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 {
public override void Invoke (Task owner, object state, Task context)
{
- var result = ((Task<int>) owner).Result;
- action (tasks [result]);
+ action (((Task<Task>)owner).Result);
}
}
public override void Invoke (Task owner, object state, Task context)
{
+ owner.TrySetExceptionObserved ();
((Task<TResult>) context).Result = action (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 {
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);
}
}
}
}
+ 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);
return new FuncTaskObjectInvoke<TResult, TNewResult> (action);
}
+ #region Used by ContinueWhenAll
+
public static TaskActionInvoker Create (Action<Task[]> action, Task[] tasks)
{
return new ActionTasksInvoke (action, 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