public static async Task WhenAnyWithResult()
        {
            var source1 = new ValueTaskCompletionSource <int>();
            var source2 = new ValueTaskCompletionSource <int>();
            var source3 = new ValueTaskCompletionSource <int>();

            ThreadPool.QueueUserWorkItem(state =>
            {
                Thread.Sleep(50);
                source1.Complete(1);
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                Thread.Sleep(200);
                source2.Complete(2);
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                Thread.Sleep(150);
                source3.Complete(3);
            });
            var completedTask = await ValueTaskSynchronization.WhenAny(source1.Task, source2.Task, source3.Task);

            True(completedTask == source1.Task);
            False(completedTask == source2.Task);
            False(completedTask == source3.Task);
            Equal(1, completedTask.Result);
        }
        public static async Task WhenAll()
        {
            var counter = new SharedCounter();
            var source1 = new ValueTaskCompletionSource();
            var source2 = new ValueTaskCompletionSource();
            var source3 = new ValueTaskCompletionSource();

            ThreadPool.QueueUserWorkItem(state =>
            {
                counter.Inc();
                Thread.Sleep(100);
                source1.Complete();
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                counter.Inc();
                Thread.Sleep(200);
                source2.Complete();
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                counter.Inc();
                Thread.Sleep(150);
                source3.Complete();
            });
            await ValueTaskSynchronization.WhenAll(source1.Task, source2.Task, source3.Task);

            Equal(3, counter.Value);
        }
        public static async Task WhenAny()
        {
            var box     = new StrongBox <int>(0);
            var source1 = new ValueTaskCompletionSource();
            var source2 = new ValueTaskCompletionSource();
            var source3 = new ValueTaskCompletionSource();

            ThreadPool.QueueUserWorkItem(state =>
            {
                box.Value.VolatileWrite(1);
                Thread.Sleep(50);
                source1.Complete();
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                box.Value.VolatileWrite(2);
                Thread.Sleep(200);
                source2.Complete();
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                box.Value.VolatileWrite(3);
                Thread.Sleep(150);
                source3.Complete();
            });
            var completedTask = await ValueTaskSynchronization.WhenAny(source1.Task, source2.Task, source3.Task);

            True(completedTask == source1.Task);
            False(completedTask == source2.Task);
            False(completedTask == source3.Task);
        }
        public static async Task CompleteWithError()
        {
            var source = new ValueTaskCompletionSource <int>();
            var task   = source.CreateTask(InfiniteTimeSpan, default);

            True(source.TrySetException(new ArithmeticException()));
            await ThrowsAsync <ArithmeticException>(() => task.AsTask());
        }
        public static async Task SuccessfulCompletion()
        {
            var source = new ValueTaskCompletionSource <int>();
            var task   = source.CreateTask(InfiniteTimeSpan, default);

            False(task.IsCompleted);
            True(source.TrySetResult(42));
            Equal(42, await task);
        }
Beispiel #6
0
        public static async Task AsyncCompletion()
        {
            var source = new ValueTaskCompletionSource();
            var task   = source.CreateTask(InfiniteTimeSpan, default);
            var result = Task.Run(async() => await task);
            await Task.Delay(10);

            True(source.TrySetResult());
            await result;
        }
        public static async Task CompleteWithToken()
        {
            var source          = new ValueTaskCompletionSource <int>();
            var completionToken = source.Reset();
            var task            = source.CreateTask(InfiniteTimeSpan, default);

            False(source.TrySetResult(short.MaxValue, 42));
            False(task.IsCompleted);
            True(source.TrySetResult(completionToken, 42));
            Equal(42, await task);
        }
        public static async Task ForceTimeout()
        {
            var source = new ValueTaskCompletionSource <int>();
            var task   = source.CreateTask(TimeSpan.FromMilliseconds(20), default);
            await Task.Delay(100);

            True(task.IsCompleted);
            await ThrowsAsync <TimeoutException>(() => task.AsTask());

            False(source.TrySetResult(42));
        }
        public static async Task Cancellation()
        {
            var source = new ValueTaskCompletionSource <int>();

            using var cancellation = new CancellationTokenSource();
            var task = source.CreateTask(InfiniteTimeSpan, cancellation.Token);

            False(task.IsCompleted);
            cancellation.Cancel();
            await ThrowsAsync <OperationCanceledException>(() => task.AsTask());

            False(source.TrySetResult(42));
        }
Beispiel #10
0
        public static async Task Reuse()
        {
            var source = new ValueTaskCompletionSource();
            var task   = source.CreateTask(InfiniteTimeSpan, default);

            True(source.TrySetResult());
            await task;

            source.Reset();
            task = source.CreateTask(InfiniteTimeSpan, default);
            True(source.TrySetResult());
            await task;
        }
        public static async Task Reuse()
        {
            var source = new ValueTaskCompletionSource <int>();

            source.Reset();
            var task = source.CreateTask(InfiniteTimeSpan, default);

            True(source.TrySetResult(42));
            Equal(42, await task);

            source.Reset();
            task = source.CreateTask(InfiniteTimeSpan, default);
            True(source.TrySetResult(43));
            Equal(43, await task);
        }
Beispiel #12
0
        public static async Task AsyncLocalAccess()
        {
            var source = new ValueTaskCompletionSource();
            var task   = source.CreateTask(InfiniteTimeSpan, default);
            var local  = new AsyncLocal <int>()
            {
                Value = 56
            };
            var result = Task.Run(async() =>
            {
                Equal(56, local.Value);
                await task;
                Equal(56, local.Value);
            });

            await Task.Delay(100);

            True(source.TrySetResult());
            await result;
        }