私のメソッドはTask
を返します。終わるまで待ちたい。 .Wait()
または.GetAwaiter().GetResult()
は何を使うべきですか?それらの違いは何ですか?
両方とも、操作の結果の同期待機です(可能な場合は回避する必要があります)。
違いは主に例外の処理です。 Wait
を使用すると、例外スタックトレースは変更されず、例外発生時の実際のスタックを表します。そのため、スレッドプールスレッドで実行されるコードがあれば、次のようなスタックになります。
ThreadPoolThread.RunTask
YourCode.SomeWork
一方、.GetAwaiter().GetResult()
は、すべての非同期コンテキストを考慮に入れてスタックトレースを作り直し、コードの一部がUIスレッドで実行され、一部がThreadPoolスレッドで実行され、一部が単に非同期I/O。したがって、スタックトレースは、コードを介した同期的なステップを反映します。
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
これは、控えめに言っても、例外スタックトレースをより便利にする傾向があります。 YourCode.SomeWork
がで呼び出された場所は、「実行された物理的な方法」ではなく、アプリケーションのコンテキストで確認できます。
これがどのように機能するかの例は、 参照ソース (もちろん、非契約)です。