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