Vergleich von Task.Result und .GetAwaiter().GetResult()
Beim Umgang mit asynchronem Code müssen Entwickler Methoden häufig synchron ausführen. Dies kann mit Task.Result
oder .GetAwaiter().GetResult()
erreicht werden. Es gibt jedoch subtile Unterschiede zwischen den beiden Ansätzen, die eine Überlegung wert sind.
Vergleich von Task.GetAwaiter().GetResult() und Task.Wait und Task.Result
Diese drei Methoden blockieren den aufrufenden Thread und warten auf den Abschluss der Aufgabe. Allerdings ist Task.GetAwaiter().GetResult()
besser als Task.Wait
und Task.Result
, da es von Aufgaben ausgelöste Ausnahmen direkt weiterleitet, anstatt sie in AggregateException
einzuschließen. Dieses Verhalten ist für die korrekte Ausnahmebehandlung von entscheidender Bedeutung.
Warum verbreiten Task.Wait und Task.Result keine Ausnahmen?
Laut Microsoft sind Task.Wait
und Task.Result
auf Abwärtskompatibilität ausgelegt. Daher schließen sie Ausnahmen in AggregateException
ein, um das Verhalten des vorhandenen Codes beizubehalten. Dieser Ansatz kann es jedoch schwierig machen, die Fehler zu ermitteln, die tatsächlich während der Aufgabe aufgetreten sind.
Vorschlag
Obwohl Task.GetAwaiter().GetResult()
hinsichtlich der Ausnahmebehandlung Vorteile gegenüber Task.Wait
und Task.Result
hat, können alle drei Methoden zu potenziellen Deadlocks und einem Thread-Pool-Aushungern führen. Die beste Vorgehensweise besteht darin, das Blockieren asynchroner Aufgaben zu vermeiden und sich stattdessen auf das async/await
-Muster zu verlassen, das es der Anwendung ermöglicht, weiterzuarbeiten, während Aufgaben im Hintergrund ausgeführt werden.
Das obige ist der detaillierte Inhalt vonTask.Result vs. GetAwaiter().GetResult(): Welche Methode sollten Sie für die synchrone Aufgabenausführung verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!