這是我在WPF.NET中遇到的一個問題。爲了說明這個問題,讓我們來看看下面的類: 爲什麼在WPF中使用ManualResetEvent和異步方法時發生死鎖?
public class TaskRunnerWithProgressFeedback(){
ManualResetEvent _event = new ManualResetEvent(false);
public void RunTask(Action action) {
_event.Reset();
//Display loading screen
RunAsync(action);
Console.WriteLine("Load completed.");
//Hide loading screen
_event.WaitOne();
}
private async void RunAsync(Action action) {
await Task.Run(() => action.Invoke());
_event.Set();
}
}
所以我在這裏有這個類,我會請從UI線程RunTask
方法。 例如:
private void Button1_OnClick(object sender , RoutedEventArgs e) {
var x = new TaskRunnerWithProgressFeedback();
x.RunTask(()=>{ /*Some time-consuming action*/ });
}
,並點擊Button1的時候,整個程序運行到一個僵持的局面。你對這種情況有任何解釋嗎?
腳註:我需要TaskRunnerWithProgressFeedback
班才能做行爲測試。我沒有使用BackgroundWorker
,因爲它會打破這些測試。
'WaitOne()'在哪裏? – Sinatr
不要在沒有await的情況下調用'async'方法。除了事件處理程序之外,不要在任何地方使用'async void'方法。 – dymanoid
Sinatr對不起,那是一個意外,只是加了回來。 –