与以前《C# 死锁 TaskCompletionSource》相似,还有不少死锁的案例html
1 private void Task_OnClick(object sender, RoutedEventArgs e) 2 { 3 AwaitUsingTask(TestAsync()); 4 Debug.WriteLine("Task_OnClick end"); 5 } 6 private void AwaitUsingTask(Task task) 7 { 8 task.Wait(); 9 //task.Result; 10 }
1 private void AwaitAutoResetEvent_OnClick(object sender, RoutedEventArgs e) 2 { 3 AwaitUsingAutoResetEvent(TestAsync()); 4 Debug.WriteLine("AwaitAutoResetEvent_OnClick end"); 5 } 6 7 public void AwaitUsingAutoResetEvent(Task task) 8 { 9 AutoResetEvent autoResetEvent = new AutoResetEvent(false); 10 11 task.ContinueWith(t => 12 { 13 autoResetEvent.Set(); 14 }); 15 autoResetEvent.WaitOne(); 16 }
TestAsync:编程
1 private static async Task TestAsync() 2 { 3 Debug.WriteLine("异步任务start……"); 4 await Task.Delay(2000); 5 Debug.WriteLine("异步任务end……"); 6 }
以上死锁的缘由:异步
如何避免:async
若是已经使用了Async/Await,那尽可能不要再使用Task.Wait()/Task.Result,让上下游的方法所有改成Async/Await原则异步编程
参考资料:post