Was ist der Unterschied zwischen .Wait() vs .GetAwaiter().GetResult()?
Meine Methode gibt Task
. Ich will warten, bis es fertig ist. Was sollte ich verwenden
.Wait()
oder .GetAwaiter().GetResult()
? Was ist der Unterschied zwischen Ihnen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide sind ein synchrones warten auf das Ergebnis der operation (und Sie sollten es vermeiden, diese, wenn möglich).
Den Unterschied vor allem in der Handhabung von Ausnahmen. Mit
Wait
die Ausnahme-stack-trace ist unverändert und stellt den tatsächlichen Stapel an der Zeit die Ausnahme, so dass, wenn Sie haben ein Stück code, das ausgeführt wird, auf einem thread-pool-thread, dann hat man einen stack wieAuf der anderen Seite
.GetAwaiter().GetResult()
wird durch überarbeitung der stack-trace, um all die asynchronen Kontext berücksichtigt, ignoriert, dass einige Teile des Codes zum ausführen auf dem UI-thread, und einige auf einem ThreadPool-thread, und einige sind einfach nur asynchrone I/O. Also dein stack trace reflektieren einen synchron-wie durch den Schritt Ihren code:Dieser neigt dazu, machen exception-stack-traces viel mehr nützlich, um das Mindeste zu sagen. Sie können sehen, wo
YourCode.SomeWork
genannt wurde in den Kontext Ihrer Anwendung, eher als "die physische Art, wie es ausgeführt wurde".Ein Beispiel, wie dies funktioniert, ist in der reference source (nicht-vertragliche, natürlich).
TaskAwaiter
ist eine Implementierung detail. Auf der anderen Seite, die erwartbaren/ "awaiter" - Mechanismus ist dokumentiert, und nutzt die duck-typing -GetAwaiter
istawait
alsGetEnumerator
istforeach
oderDispose
istusing
. All das ist definiert in der C# - Spezifikation, unabhängig von der besonderen "awaiter" verwendet wird - beachten Sie, dassTask.GetAwaiter
ist "für den compiler nutzen, anstatt für die Verwendung im Anwendungscode." Aber der Punkt ist, dass die bestimmungsgemäße Verwendung ist zu tun, eineawait
, nichtWait()
nochGetAwaiter().GetResult()
- aberGetResult
gibt Sie schöner Stapel, wenn Sie es brauchen.