it-swarm.com.de

Was ist der Unterschied zwischen .Wait () und .GetAwaiter (). GetResult ()?

Meine Methode gibt Task zurück. Ich möchte warten, bis es fertig ist. Was soll ich .Wait() oder .GetAwaiter().GetResult() verwenden? Was ist der Unterschied zwischen ihnen?

63
user6011767

Beides ist ein synchrones Warten auf das Ergebnis der Operation (und Sie sollten diese nach Möglichkeit vermeiden).

Der Unterschied liegt hauptsächlich in der Behandlung von Ausnahmen. Mit Wait wird die Ablaufverfolgung des Ausnahmestapels nicht geändert und stellt den tatsächlichen Stapel zum Zeitpunkt der Ausnahme dar. Wenn Sie also einen Code haben, der auf einem Thread-Pool-Thread ausgeführt wird, haben Sie einen Stapel wie

ThreadPoolThread.RunTask
YourCode.SomeWork

Auf der anderen Seite überarbeitet .GetAwaiter().GetResult() den Stack-Trace, um den gesamten asynchronen Kontext zu berücksichtigen, wobei ignoriert wird, dass einige Teile des Codes im UI-Thread und einige in einem ThreadPool-Thread ausgeführt werden und andere einfach sind asynchrone E/A. Ihr Stack-Trace spiegelt also einen synchronen Schritt durch Ihren Code wider:

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

Dies führt dazu, dass Ausnahmestapel-Traces viel nützlicher sind, um es gelinde auszudrücken. Sie können sehen, wo YourCode.SomeWork im Kontext Ihrer Anwendung aufgerufen wurde, und nicht "auf physikalische Weise".

Ein Beispiel dafür finden Sie in der Referenzquelle (natürlich nicht vertraglich).

74
Luaan