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);
        }
Exemplo n.º 6
0
        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;
        }
Exemplo n.º 7
0
        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();
        }
Exemplo n.º 9
0
 public void Setup()
 {
     awaitableCompletionSource = AwaitableCompletionSource.Create <string>();
 }
Exemplo n.º 10
0
 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;
 }