Rumah > pembangunan bahagian belakang > C++ > Kenapa `httpclient.getasync (...)` kadang -kadang kebuntuan apabila menggunakan `Await`/` async` dalam asp.net?

Kenapa `httpclient.getasync (...)` kadang -kadang kebuntuan apabila menggunakan `Await`/` async` dalam asp.net?

Mary-Kate Olsen
Lepaskan: 2025-01-25 13:37:09
asal
549 orang telah melayarinya

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

dalam asp.net

menggunakan /HttpClient.GetAsync(...) kadang -kadang, await async Apabila menggunakan fungsi bahasa dan tugas baru dan tugas -tugas baru dalam .NET 4.5, hasil "menunggu"

kadang -kadang terjebak. Ini disebabkan oleh penyalahgunaan API.

async Penjelasan await httpClient.GetAsync(...)

Di ASP.NET, hanya ada satu benang pada satu masa yang dapat mengendalikan satu permintaan. Jika perlu, anda boleh melakukan rawatan selari, tetapi anda perlu meminjam benang tambahan dari kolam thread. Ini diuruskan oleh Asp.net SynchronizationContext.

Secara lalai, apabila menunggu tugas, kaedah akan pulih pada penyegerakan yang ditangkap atau ditangkap Taskscheduler (tanpa SynchronizationContext). Biasanya, ini sesuai: operasi pengawal tak segerak akan menunggu beberapa kandungan.

test5controller.get

Kaedah pengawal khusus ini melaksanakan asyncawait_getsomedataasync (dalam permintaan ASP.NET). Asyncawait_getsomedataasync melaksanakan httpclient.getAsync (dalam permintaan ASP.NET). Permintaan HTTP dihantar, dan httpclient.getasync mengembalikan tugas yang belum selesai. Kemudian, asyncawait_getsomedataasync sedang menunggu tugas yang belum selesai, jadi ia mengembalikan tugas yang belum selesai. Sekarang, test5controller.get menghalang benang semasa sehingga tugas selesai.

Respons HTTP akan datang, dan tugas yang dikembalikan oleh httpclient.getasync selesai. Kemudian, asyncawait_getsomedataasync cuba pulih dalam konteks permintaan ASP.NET. Walau bagaimanapun, sudah ada benang dalam konteks: benang yang menyekat dalam test5controller.get. Ini akan menyebabkan kunci mati. Amalan Terbaik

Untuk membetulkan masalah ini, saya cadangkan:

Gunakan dalam kaedah asynchronous "perpustakaan" anda. Dalam kes ini, asyncawait_getsomedataasync akan ditukar kepada

Elakkan menyekat tugas;

  • dengan mengikuti amalan terbaik ini, kesinambungan (selebihnya asyncawait_getsomedataasync kaedah) akan berjalan pada benang kolam thread biasa pada konteks permintaan ASP.NET, dan pengawal itu sendiri adalah asynchronous (ia tidak akan menghalang benang permintaan) ConfigureAwait(false)

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan