public async Task TaskCount_1000_Test() { var ran = new Random(); var sources = Enumerable.Range(0, 1000).Select(i => AwaitableCompletionSource.Create <int>()).ToArray(); foreach (var item in sources) { // 2秒后没有结果的,自动设置为0 item.TrySetResultAfter(0, TimeSpan.FromSeconds(2d)); } var resultValue = 2; var resultSources = sources.Where(i => ran.Next(0, 1000) < 500).ToArray(); Assert.NotEqual(sources.Length, resultSources.Length); foreach (var item in resultSources) { ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource)s).TrySetResult(resultValue), item); } var tasks = sources.Select(a => AwaitableToTask <int>(a)); var t = await Task.WhenAll(tasks); var sum = resultSources.Length * resultValue; foreach (var item in sources) { item.Dispose(); } Assert.Equal(sum, t.Sum()); }
public async Task TrySetExceptionAfterTest() { using var source = AwaitableCompletionSource.Create <string>(); Assert.False(source.Task.GetAwaiter().IsCompleted); source.TrySetExceptionAfter(new TimeoutException(), TimeSpan.FromMilliseconds(1)); await Assert.ThrowsAsync <TimeoutException>(async() => await source.Task); }
public async Task TrySetExceptionTest() { using var source = AwaitableCompletionSource.Create <string>(); Assert.False(source.Task.GetAwaiter().IsCompleted); ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource <string>)s).TrySetException(new TimeoutException()), source); await Assert.ThrowsAsync <TimeoutException>(async() => await source.Task); }
public async Task TrySetResultAfterTest() { using var source = AwaitableCompletionSource.Create <string>(); Assert.False(source.Task.GetAwaiter().IsCompleted); source.TrySetResultAfter("Result", TimeSpan.FromMilliseconds(1)); var result = await source.Task; Assert.Equal("Result", result); }
public async Task TrySetResultTest() { using var source = AwaitableCompletionSource.Create <string>(); Assert.False(source.Task.GetAwaiter().IsCompleted); ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource <string>)s).TrySetResult("Result"), source); var result = await source.Task; Assert.Equal("Result", result); }
public async Task AwaitableCompletionSource_WithTimeout() { using var source = AwaitableCompletionSource.Create <string>(); source.TrySetResultAfter("timeout", TimeSpan.FromMilliseconds(1000d)); // ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource<string>)s).TrySetResult("Result"), source); source.TrySetResult("Result"); await source.Task; }
public async Task AwaitableCompletionSource_SetResult() { using var source = AwaitableCompletionSource.Create <string>(); // 这里应该模拟其它线程给它设置结果 // 但是这样不能体现CompletionSource的内存分配 // 所以使用source.TrySetResult("Result")替代 //ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource<string>)s).TrySetResult("Result"), source); source.TrySetResult("Result"); await source.Task; }
static async Task Main(string[] args) { var source = AwaitableCompletionSource.Create <string>(); ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource)s).TrySetResult("1"), source); Console.WriteLine(await source.Task); // 支持多次设置获取结果 source.TrySetResultAfter("2", TimeSpan.FromSeconds(1d)); Console.WriteLine(await source.Task); // 支持多次设置获取结果 source.TrySetResultAfter("3", TimeSpan.FromSeconds(2d)); Console.WriteLine(await source.Task); // 实例使用完成之后,可以进行回收复用 source.Dispose(); Console.ReadLine(); }
public void Setup() { awaitableCompletionSource = AwaitableCompletionSource.Create <string>(); }
private async void Form1_Load(object sender, EventArgs e) { using var source = AwaitableCompletionSource.Create <string>(); ThreadPool.QueueUserWorkItem(s => ((IAwaitableCompletionSource)s).TrySetResult("AwaitableCompletionSource"), source); this.Text = await source.Task; }