Rumah >pembangunan bahagian belakang >C++ >Kenapa `httpclient.getAsync (...)` Hang apabila menggunakan `menunggu`/` async` dalam asp.net?

Kenapa `httpclient.getAsync (...)` Hang apabila menggunakan `menunggu`/` async` dalam asp.net?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-25 13:28:10316semak imbas

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

ASP.NET async/await dan HttpClient.GetAsync(...) Kebuntuan: Penyelesaian

Masalahnya: Menggunakan HttpClient.GetAsync(...) dalam kaedah ASP.NET async boleh membawa kepada kebuntuan. Ini berlaku kerana model pemprosesan permintaan satu benang ASP.NET bercanggah dengan sifat tak segerak HttpClient. Apabila await menjeda pelaksanaan, urutan dilepaskan, tetapi meneruskan tugasan mungkin cuba mendapatkan semula urutan yang sama yang telah diduduki oleh permintaan lain, menyebabkan terhenti.

Memahami Kebuntuan:

  1. httpClient.GetAsync mengembalikan Task yang tidak lengkap.
  2. await menggantung urutan semasa sehingga Task tamat.
  3. Task cuba menyambung semula dalam konteks permintaan ASP.NET, tetapi konteksnya sudah digunakan.
  4. Hasil kebuntuan.

Penyelesaian Utama:

  1. ConfigureAwait(false): Kaedah penting ini menghalang penerusan Task daripada dijadualkan kembali ke konteks asal (cth., urutan permintaan ASP.NET). Ini menghapuskan potensi kebuntuan berkaitan konteks.

  2. Elakkan Menyekat: Sentiasa gunakan await dan bukannya kaedah seperti GetResult() yang menyekat secara serentak pada Task, terus membawa kepada kebuntuan.

Contoh Kod:

Kod Bermasalah:

<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>

Kod Dibetulkan:

<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>

Bacaan Lanjut:

Untuk pemahaman yang lebih mendalam tentang pengaturcaraan tak segerak dalam .NET dan cara mengelakkan kebuntuan, rujuk sumber ini:

Dengan menggunakan secara konsisten ConfigureAwait(false) dalam kaedah tak segerak anda, anda boleh mencegah kebuntuan ini dengan berkesan dan memastikan operasi lancar aplikasi ASP.NET anda.

Atas ialah kandungan terperinci Kenapa `httpclient.getAsync (...)` Hang apabila menggunakan `menunggu`/` async` dalam asp.net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn