ホームページ > バックエンド開発 > C++ > `httpclient.getasync()` async/async/await in async/wait with deadlockが.net 4.5でデッドロックするのはなぜですか?

`httpclient.getasync()` async/async/await in async/wait with deadlockが.net 4.5でデッドロックするのはなぜですか?

DDD
リリース: 2025-01-25 13:31:10
オリジナル
694 人が閲覧しました

Why Does `HttpClient.GetAsync()` Deadlock with Async/Await in .NET 4.5?

.NET 4.5

およびAsync/async/async/async/async/async/async モードと組み合わせてHttpClient.GetAsync()クラスを使用する場合、場合によっては結果の結果が無期限に発生する可能性があります。提供されているコードでは、この動作は「TEST5」の場合に観察され、

クラスにエラーがあるかAPIがあったかどうかという問題を引き起こしました。

HttpClient ロックの理由async/awaithttpClient.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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート