设为首页 加入收藏

TOP

C# 异步转同步 TaskCompletionSource
2019-09-17 17:02:33 】 浏览:14
Tags:异步 同步 TaskCompletionSource

本文通过TaskCompletionSource,实现异步转同步

首先有一个异步方法,如下异步任务延时2秒后,返回一个结果

1     private static async Task<string> TestWithResultAsync()
2     {
3         Debug.WriteLine("1. 异步任务start……");
4         await Task.Delay(2000);
5         Debug.WriteLine("2. 异步任务end……");
6         return "2秒以后";
7     }

如何使用TaskCompletionSource将此异步方法转成同步呢?

1     private void TaskCompleteSourceButton_OnClick(object sender, RoutedEventArgs e)
2     {
3         var result = AwaitByTaskCompleteSource(TestWithResultAsync);
4         Debug.WriteLine($"4. TaskCompleteSource_OnClick end:{result}");
5     }

TaskCompletionSource使用步骤:

  1. 获取var sourceTask =TaskCompletionSource.Task,
  2. 等待此sourceTask结果-sourceTask.Result
  3. 设置设置sourceTask.Result的结果值
 1     private string AwaitByTaskCompleteSource(Func<Task<string>> func)
 2     {
 3         var taskCompletionSource = new TaskCompletionSource<string>();
 4         var task1 = taskCompletionSource.Task;
 5         Task.Run(async () =>
 6         {
 7             var result = await func.Invoke();
 8             taskCompletionSource.SetResult(result);
 9         });
10         var task1Result = task1.Result;
11         Debug.WriteLine($"3. AwaitByTaskCompleteSource end:{task1Result}");
12         return task1Result;
13     }

测试结果:

 关键字:异步转同步,TaskCompletionSource

参考资料:

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇GRPC与.net core 下一篇C# 死锁 TaskCompletionSource

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目