C# 異步轉同步 TaskCompletionSource

本文經過TaskCompletionSource,實現異步轉同步異步

首先有一個異步方法,以下異步任務延時2秒後,返回一個結果async

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使用步驟:spa

  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     }

測試結果:code

 

 關鍵字:異步轉同步,TaskCompletionSourceblog

相關文章
相關標籤/搜索