web-dev-qa-db-ja.com

.GetAwaiter()。GetResult();一般的に使用しても安全ですか?

.GetAwaiter().GetResult();がデッドロックを引き起こす可能性があり、代わりにasync/awaitを使用する必要があることをいくつかの場所で読みました。しかし、私はこれが使用されている多くのコードサンプルを見ています。使用しても大丈夫ですか?デッドロックが発生する可能性があるケースはどれですか? Task.Waitなど、他に使用すべきものはありますか?

23
Cyan

ブログで説明しているように、 GetAwaiter().GetResult()は、一度に1スレッドのコンテキストで使用するとデッドロックする可能性があります 。これは、UIスレッドまたはASP.NETコンテキスト(コアCore ASP.NETの場合)で呼び出されたときに最もよく見られます。

Waitにも同じ問題があります。適切な修正は、awaitを使用し、呼び出しコードを非同期にすることです。

コンソールアプリのMainメソッドは、このルールの例外であることに注意してください。そこで使用するのが完全に適切です。多くのコードサンプルがこの方法で使用します。

42
Stephen Cleary