ホームページ > バックエンド開発 > C++ > ASP.NET で `await`/`async` を使用すると `HttpClient.GetAsync(...)` がハングするのはなぜですか?

ASP.NET で `await`/`async` を使用すると `HttpClient.GetAsync(...)` がハングするのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-25 13:28:10
オリジナル
282 人が閲覧しました

Why Does `HttpClient.GetAsync(...)` Hang When Using `await`/`async` in ASP.NET?

ASP.NET async/await および HttpClient.GetAsync(...) のデッドロック: 解決策

問題: ASP.NET HttpClient.GetAsync(...) メソッド内で async を使用すると、デッドロックが発生する可能性があります。これは、ASP.NET のシングルスレッド要求処理モデルが HttpClient の非同期の性質と競合するために発生します。 await が実行を一時停止すると、スレッドは解放されますが、タスクを再開すると、別のリクエストによってすでに占有されている同じスレッドを再取得しようとする可能性があり、停止が発生します。

デッドロックを理解する:

  1. httpClient.GetAsync は不完全な Task を返します。
  2. await は、Task が終了するまで現在のスレッドを一時停止します。
  3. Task は ASP.NET 要求コンテキスト内で再開しようとしますが、コンテキストはすでに使用されています。
  4. デッドロックが発生します。

主要なソリューション:

  1. ConfigureAwait(false): この重要なメソッドは、Task の継続が元のコンテキスト (ASP.NET 要求スレッドなど) にスケジュールされるのを防ぎます。これにより、コンテキスト関連のデッドロックの可能性が排除されます。

  2. ブロックの回避: await 上で同期的にブロックし、デッドロックに直接つながる GetResult() のようなメソッドではなく、常に Task を使用してください。

コード例:

問題のあるコード:

<code class="language-csharp">public async Task<string> GetSomeDataAsync()
{
    var httpClient = new HttpClient();
    var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);
    return result.Content.Headers.ToString();
}</code>
ログイン後にコピー

修正コード:

<code class="language-csharp">public async Task<string> GetSomeDataAsync()
{
    var httpClient = new HttpClient();
    var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
    return result.Content.Headers.ToString();
}</code>
ログイン後にコピー

さらに読む:

.NET での非同期プログラミングとデッドロックを回避する方法をより深く理解するには、次のリソースを参照してください。

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

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