ホームページ > バックエンド開発 > C++ > `httpclient.getasync(...)` asp.netで `await`/` async`を使用するときに時々デッドロックするのはなぜですか?

`httpclient.getasync(...)` asp.netで `await`/` async`を使用するときに時々デッドロックするのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-25 13:37:09
オリジナル
549 人が閲覧しました

Why does `HttpClient.GetAsync(...)` sometimes deadlock when using `await`/`async` in ASP.NET?

in asp.net

.NET 4.5で新しいHttpClient.GetAsync(...)/await言語関数とタスクAPIを使用すると、asyncの「待ち望んでいる」結果は、時々スタックされる可能性があります。これは、APIの誤用によって引き起こされます。

説明

async await asp.netでは、一度に1つのリクエストを処理できるスレッドは1つだけです。必要に応じて、並列処理を実行できますが、スレッドプールから追加のスレッドを借りる必要があります。これは、asp.net synchronizationcontextによって管理されます。 httpClient.GetAsync(...)

デフォルトでは、タスクを待っているときに、メソッドはキャプチャされた同期コンテキストまたはキャプチャされたタスクシェードラー(SynchronizationContextなし)で回復します。通常、これは理想的です。非同期コントローラーの操作は、いくつかのコンテンツを回復すると、リクエストコンテキストを使用します。

test5controller.get

この特定のコントローラーメソッドは、asyncawait_getsomedataasync(ASP.NETリクエストで)を実行します。 asyncawait_getsomedataasyncはhttpclient.getasync(asp.netリクエストで)を実行します。 httpリクエストが送信され、httpclient.getasyncは未完成のタスクを返しました。次に、Asyncawait_getsomedataasyncが未完成のタスクを待っているため、未完成のタスクを返します。次に、test5controller.getは、タスクが完了するまで現在のスレッドをブロックします。

http応答が来ており、httpclient.getasyncによって返されるタスクが完了しました。次に、Asyncawait_getsomedataasyncは、ASP.NETリクエストのコンテキストで回復しようとしました。ただし、コンテキストには既にスレッドがあります。Test5Controller.getでのスレッドブロッキングです。これにより、死んだロックが発生します。

ベストプラクティス この問題を修正するために、私は次のように提案します。

「ライブラリ」の非同期方法で

を使用します。この場合、asyncawait_getsomedataasyncは

に変更されます

タスクのブロックを避けます。 これらのベストプラクティスに従うことにより、継続(asyncawait_getsomedataasyncメソッドの残りの部分)は、asp.net要求コンテキストで通常のスレッドプールスレッドで実行され、コントローラー自体は非同期です(リクエストスレッドはブロックされません)エッセンス

以上が`httpclient.getasync(...)` asp.netで `await`/` async`を使用するときに時々デッドロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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