public void SetFromCompletedTaskVoid() { var cex = new Exception[] { new InvalidEnumArgumentException(), new InvalidProgramException() }; var r1 = new TaskCompletionSource(); r1.SetFromCompletedTask(Tasks.RanToCompletion()); r1.Task.AssertRanToCompletion(); var r2 = new TaskCompletionSource(); r2.SetFromCompletedTask(Tasks.Cancelled()); r2.Task.AssertCancelled(); var r3 = new TaskCompletionSource(); r3.SetFromCompletedTask(Tasks.Faulted(new InvalidEnumArgumentException())); r3.Task.AssertFailed<InvalidEnumArgumentException>(); var r4 = new TaskCompletionSource(); r4.SetFromCompletedTask(Tasks.Faulted(cex)); r4.Task.AssertFailed<AggregateException>().InnerExceptions.AssertSequenceEquals(cex); // failed transitions Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.RanToCompletion())); Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.Cancelled())); Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.Faulted(new InvalidEnumArgumentException()))); Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.Faulted(cex))); }
///<summary>Posts an action to the synchronization context, exposing its eventual completion as a task.</summary> public static Task PostAction(this SynchronizationContext context, Action action) { if (context == null) { throw new ArgumentNullException("context"); } if (action == null) { throw new ArgumentNullException("action"); } var t = new TaskCompletionSource(); context.Post(x => t.SetFromCompletedTask(Tasks.FromExecution(action)), null); return(t.Task); }
///<summary>Posts a function to the synchronization context, exposing its eventual result as a task.</summary> public static Task <T> PostFunc <T>(this SynchronizationContext context, Func <T> func) { if (context == null) { throw new ArgumentNullException("context"); } if (func == null) { throw new ArgumentNullException("func"); } var t = new TaskCompletionSource <T>(); context.Post(x => t.SetFromCompletedTask(Tasks.FromEvaluation(func)), null); return(t.Task); }
///<summary>A task that faults if the given task is cancelled, or else contains the same eventual result.</summary> public static Task WithCancellationToTaskCanceledException(this Task task) { if (task == null) { throw new ArgumentNullException("task"); } var r = new TaskCompletionSource(); task.ContinueWith( t => { if (t.IsCanceled) { r.SetException(new TaskCanceledException()); } else { r.SetFromCompletedTask(t); } }, TaskContinuationOptions.ExecuteSynchronously); return(r.Task); }
///<summary>A task that is cancelled if the given task contains an OperationCanceledException, or else contains the same eventual result.</summary> public static Task <T> WithCanceledExceptionToCancellation <T>(this Task <T> task) { if (task == null) { throw new ArgumentNullException("task"); } var r = new TaskCompletionSource <T>(); task.ContinueWith( t => { if (t.IsFaulted && t.Exception.InnerExceptions.Count == 1 && t.Exception.InnerExceptions[0] is OperationCanceledException) { r.SetCanceled(); } else { r.SetFromCompletedTask(t); } }, TaskContinuationOptions.ExecuteSynchronously); return(r.Task); }