與以前《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