public static void TaskExGenericFromCanceledIsCanceled() { using (var source = new CancellationTokenSource()) { source.Cancel(); var task = TaskExEx.FromCanceled <bool>(source.Token); Assert.IsTrue(task.IsCanceled); } }
public Task <bool> WaitAsync(int millisecondsTimeout, CancellationToken cancellationToken) { var state = GetState(); if (millisecondsTimeout < -1) { throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout)); } if (cancellationToken.IsCancellationRequested) { return(TaskExEx.FromCanceled <bool>(cancellationToken)); } var source = new TaskCompletionSource <bool>(); if (state.CanEnter.Wait(0, cancellationToken) && TryOffset(-1, out var dummy, state)) { source.SetResult(true); return(source.Task); } RootedTimeout.Launch ( () => { try { source.SetResult(false); } catch (InvalidCastException exception) { // Already canceled No.Op(exception); } }, () => { try { source.SetCanceled(); } catch (InvalidOperationException exception) { // Already timeout No.Op(exception); } }, millisecondsTimeout, cancellationToken ); state.AsyncWaiters.Add(source); return(source.Task); }
public static void TaskExGenericFromCanceledThrowsOnNonCanceledToken() { Assert.Throws <ArgumentOutOfRangeException, Task <bool> >(() => TaskExEx.FromCanceled <bool>(CancellationToken.None)); }