ホームページ > バックエンド開発 > C++ > ASP.NET で Await/Async を使用すると HttpClient.GetAsync 呼び出しがハングするのはなぜですか?

ASP.NET で Await/Async を使用すると HttpClient.GetAsync 呼び出しがハングするのはなぜですか?

DDD
リリース: 2025-01-25 13:23:08
オリジナル
766 人が閲覧しました

Why Does My HttpClient.GetAsync Call Hang When Using Await/Async in ASP.NET?
ASP.NETで、asp.netで、await/asyncを使用する場合

asp.netでは、1つのリクエストを同時に処理できるスレッドのみが1つのスレッドのみです。並行して実行できますが、リクエストコンテキストがあるスレッドは1つだけです。このスレッドは、ASP.NET SynchronizationContextによって制御されます。

タスクを待つとき、メソッドは通常、キャプチャされた同期コンテキストで復元されます(存在がない場合は、タスクシェードラーです)。これは、非同期コントローラー操作の予想される動作と一致しています。

テストケース5の問題test5controller.getは、次の順序によって引き起こされます

asp.netリクエストのコンテキストでhttpclient.getasyncを呼び出します。

httpclient.getasync httpリクエストを送信し、未完成のタスクを返します。 asyncawait_getsomedataasyncはタスクを待ち、リクエストがまだ進行中であるため、未完成のタスクを返します。

test5controller.getは、タスクがAsyncawait_getsomedataasyncによって返されるまで現在のスレッドをブロックします。

    http応答を受信し、httpclient.getasyncタスクが完了します。
  1. asyncawait_getsomedataasyncは、asp.netリクエストのコンテキストで回復しようとします。
  2. Test5Controller.getで妨害されたスレッドが要求のコンテキストを保持しているため、
  3. 死んだロック。
  4. 問題を解決します
  5. 同様の問題を回避するためにいくつかのベストプラクティスを実装できます:
  6. configureAwait(false)を使用して、ASP.NETリクエストのコンテキストを超えてスケ​​ジューリングを継続します。
  7. タスクをブロックしないように、getResultまたはtask.waitの代わりにawaitを使用することにより。

結論

同期コンテキストの役割とAsync/awaitテクノロジーを使用したベストプラクティスの理解では、ASP.NETで非同期コードを使用して効率的に使用し、非同期コードを使用するときにデッドロックを持たないようにすることができます。

以上がASP.NET で Await/Async を使用すると HttpClient.GetAsync 呼び出しがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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