在异步转同步时,使用不当容易形成死锁(程序卡死)编程
看以下案例:异步
有一个异步方法async
1 private static async Task TestAsync() 2 { 3 Debug.WriteLine("异步任务start……"); 4 await Task.Delay(2000); 5 Debug.WriteLine("异步任务end……"); 6 }
在执行如上异步方法时,尝试将其转换为同步方法异步编程
按照官方文档《使用任务简化异步编程》,TaskCompletionSource使用步骤:spa
1 private void TaskCompleteSourceDead_OnClick(object sender, RoutedEventArgs e) 2 { 3 AwaitByTaskCompleteSource(TestAsync()); 4 Debug.WriteLine($"4. TaskCompleteSource_OnClick end"); 5 } 6 private void AwaitByTaskCompleteSource(Task task) 7 { 8 var taskCompletionSource = new TaskCompletionSource<object>(); 9 var taskFromSource = taskCompletionSource.Task; 10 task.ContinueWith(action => 11 { 12 taskCompletionSource.SetResult(true); 13 }); 14 var task1Result = taskFromSource.Result; 15 Debug.WriteLine($"3. AwaitByTaskCompleteSource end:{task1Result}"); 16 }
可是,以上逻辑执行时,界面会卡死!卡死效果以下,卡死的时候点击界面其它按钮无任何反应。线程
为什么会死锁?code
猜想可能与Task.wait()相似的死锁,详细以下:blog
关键字:死锁、TaskCompletionSource文档