Exemplo n.º 1
0
 public static void TaskExGenericFromCanceledIsCanceled()
 {
     using (var source = new CancellationTokenSource())
     {
         source.Cancel();
         var task = TaskExEx.FromCanceled <bool>(source.Token);
         Assert.IsTrue(task.IsCanceled);
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public static void TaskExGenericFromCanceledThrowsOnNonCanceledToken()
 {
     Assert.Throws <ArgumentOutOfRangeException, Task <bool> >(() => TaskExEx.FromCanceled <bool>(CancellationToken.None));
 }