欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 异步转同步 TaskCompletionSource

程序员文章站 2023-11-06 10:12:58
本文通过TaskCompletionSource,实现异步转同步 首先有一个异步方法,如下异步任务延时2秒后,返回一个结果 如何使用TaskCompletionSource将此异步方法转成同步呢? TaskCompletionSource使用步骤: 测试结果: 关键字:异步转同步,TaskCompl ......

本文通过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     }

测试结果:

C# 异步转同步 TaskCompletionSource

 

 关键字:异步转同步,taskcompletionsource