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