C# 異步轉同步 PushFrame

異步轉同步-PushFrame

本文經過PushFrame,實現異步轉同步html

首先有一個異步方法,以下異步任務延時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     }

在UI線程執行此任務,嘗試轉化爲同步async

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

PushFrame異步轉同步的實現:post

 1     public static TResult AwaitByPushFrame<TResult>(Task<TResult> task)
 2     {
 3         var frame = new DispatcherFrame();
 4         task.ContinueWith(t =>
 5         {
 6             frame.Continue = false;
 7         });
 8         Dispatcher.PushFrame(frame);
 9         return task.Result;
10     }

測試結果:測試

 

Task不帶返回值的處理:spa

1     public static void AwaitByPushFrame(Task task)
2     {
3         var frame = new DispatcherFrame();
4         task.ContinueWith(t =>
5         {
6             frame.Continue = false;
7         });
8         Dispatcher.PushFrame(frame);
9     }

 PushFrame的缺陷

PS:pushFrame雖然可以實現異步轉同步,但也有缺陷,能夠選擇性的使用線程

 

PushFrame的詳細原理及缺陷,可參考小夥伴水先生的《 深刻了解 WPF Dispatcher 的工做原理(PushFrame 部分)code

相關文章
相關標籤/搜索