およびAsync/async/async/async/async/async/async モードと組み合わせてHttpClient.GetAsync()
クラスを使用する場合、場合によっては結果の結果が無期限に発生する可能性があります。提供されているコードでは、この動作は「TEST5」の場合に観察され、
HttpClient
ロックの理由async/await
httpClient.GetAsync(...)
HttpClient
死んだロックは、モードで使用されるスレッドコンテキストと同期メカニズムによって引き起こされます。 ASP.NETリクエストが
で回復して、コンテキストリザーブが必要であることを確認します。 ただし、test5の場合、の場合、
の結果、つまりの結果を待つときにブロッキング操作を開始しました。これにより、リクエストコンテキストでスレッドがブロックされ、コンテキストでのasync/await
の完了が妨げられます。 Task
SynchronizationContext
async/await and httpclientのベストプラクティス
AsyncAwait_GetSomeDataAsync
このデッドロックを避けるために、次のベストプラクティスを使用することをお勧めします。
HttpClient.GetAsync
Test5Controller.Get
「ライブラリ」の非同期方法でTask
を可能な限り使用します。これにより、通常のスレッドプールスレッドで実行し続け、ASP.NETリクエストコンテキストをバイパスできます。
閉塞を避けます操作。
これらのプラクティスに従うことにより、同時にの使用の2つの利点を使用できます。ASP.NETリクエストを必要とせずに、個別のスレッドプールスレッドでの実行が続き、コントローラー自体を非同期に保ちますスレッドブロッキングの要求を防ぐ
以上が`httpclient.getasync()` async/async/await in async/wait with deadlockが.net 4.5でデッドロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。