web-dev-qa-db-ja.com

.Wait()と.GetAwaiter()。GetResult()の違いは何ですか?

私のメソッドはTaskを返します。終わるまで待ちたい。 .Wait()または.GetAwaiter().GetResult()は何を使うべきですか?それらの違いは何ですか?

63
user6011767

両方とも、操作の結果の同期待機です(可能な場合は回避する必要があります)。

違いは主に例外の処理です。 Waitを使用すると、例外スタックトレースは変更されず、例外発生時の実際のスタックを表します。そのため、スレッドプールスレッドで実行されるコードがあれば、次のようなスタックになります。

ThreadPoolThread.RunTask
YourCode.SomeWork

一方、.GetAwaiter().GetResult()は、すべての非同期コンテキストを考慮に入れてスタックトレースを作り直し、コードの一部がUIスレッドで実行され、一部がThreadPoolスレッドで実行され、一部が単に非同期I/O。したがって、スタックトレースは、コードを介した同期的なステップを反映します。

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

これは、控えめに言っても、例外スタックトレースをより便利にする傾向があります。 YourCode.SomeWorkで呼び出された場所は、「実行された物理的な方法」ではなく、アプリケーションのコンテキストで確認できます。

これがどのように機能するかの例は、 参照ソース (もちろん、非契約)です。

74
Luaan