public void SetException_OperationCanceledException_CancelsTask() { AsyncValueTaskMethodBuilder<int> b = ValueTask<int>.CreateAsyncMethodBuilder(); var e = new OperationCanceledException(); ValueTask<int> vt = b.Task; b.SetException(e); Assert.True(vt.IsCanceled); Assert.Same(e, Assert.Throws<OperationCanceledException>(() => vt.GetAwaiter().GetResult())); }
public static IEnumerable<object[]> CanceledTasksAndExpectedCancellationExceptions() { var cts = new CancellationTokenSource(); var oce = new OperationCanceledException(cts.Token); // Scheduled Task Task<int> generic = Task.Run<int>(new Func<int>(() => { cts.Cancel(); throw oce; }), cts.Token); yield return new object[] { LineNumber(), generic, oce }; Task nonGeneric = generic; // WhenAll Task and Task<int> yield return new object[] { LineNumber(), Task.WhenAll(generic), oce }; yield return new object[] { LineNumber(), Task.WhenAll(generic, Task.FromResult(42)), oce }; yield return new object[] { LineNumber(), Task.WhenAll(Task.FromResult(42), generic), oce }; yield return new object[] { LineNumber(), Task.WhenAll(generic, generic, generic), oce }; yield return new object[] { LineNumber(), Task.WhenAll(nonGeneric), oce }; yield return new object[] { LineNumber(), Task.WhenAll(nonGeneric, Task.FromResult(42)), oce }; yield return new object[] { LineNumber(), Task.WhenAll(Task.FromResult(42), nonGeneric), oce }; yield return new object[] { LineNumber(), Task.WhenAll(nonGeneric, nonGeneric, nonGeneric), oce }; // Task.Run Task and Task<int> with unwrapping yield return new object[] { LineNumber(), Task.Run(() => generic), oce }; yield return new object[] { LineNumber(), Task.Run(() => nonGeneric), oce }; // A FromAsync Task and Task<int> yield return new object[] { LineNumber(), Task.Factory.FromAsync(generic, new Action<IAsyncResult>(ar => { throw oce; })), oce }; yield return new object[] { LineNumber(), Task<int>.Factory.FromAsync(nonGeneric, new Func<IAsyncResult, int>(ar => { throw oce; })), oce }; // AsyncTaskMethodBuilder var atmb = new AsyncTaskMethodBuilder(); atmb.SetException(oce); yield return new object[] { LineNumber(), atmb.Task, oce }; }
public static void OperationCanceledException_PropagatesThroughCanceledTask(int lineNumber, Task task, OperationCanceledException expected) { var caught = Assert.ThrowsAny<OperationCanceledException>(() => task.GetAwaiter().GetResult()); Assert.Same(expected, caught); }