Dies ist eine Frage, die ich in WPF.NET konfrontiert wurde. Um das Problem zu veranschaulichen, lassen Sie uns in der Klasse einen Blick unter: Warum tritt ein Deadlock bei der Verwendung von ManualResetEvent und der asynchronen Methode in WPF auf?
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();
}
}
So habe ich diese Klasse hier, und ich werde die RunTask
Methode von einem UI-Thread aufrufen. Zum Beispiel:
private void Button1_OnClick(object sender , RoutedEventArgs e) {
var x = new TaskRunnerWithProgressFeedback();
x.RunTask(()=>{ /*Some time-consuming action*/ });
}
Und wenn Button1 geklickt wird, läuft das ganze Programm in eine Deadlocks Situation. Haben Sie eine Erklärung für diese Situation?
Fußnote: Ich brauche die TaskRunnerWithProgressFeedback
Klasse für mich, um Verhaltenstests durchzuführen. Ich verwende nicht BackgroundWorker
, weil es diese Tests bricht.
Wo ist 'WaitOne()'? – Sinatr
Rufen Sie keine Async-Methode ohne "erwarten" an. Und verwenden Sie 'async void' Methoden nicht mit Ausnahme von Event-Handlern. – dymanoid
Sinatr sorry, das war ein Unfall, nur hinzugefügt es zurück. –