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); }
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)); }
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); }
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; }