C# 異步轉同步 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

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM