Rumah > pembangunan bahagian belakang > C++ > Kenapa `httpclient.getAsync ()` Deadlock dengan async/menunggu dalam .net 4.5?

Kenapa `httpclient.getAsync ()` Deadlock dengan async/menunggu dalam .net 4.5?

DDD
Lepaskan: 2025-01-25 13:31:10
asal
694 orang telah melayarinya

Why Does `HttpClient.GetAsync()` Deadlock with Async/Await in .NET 4.5?

Dalam .NET 4.5, HttpClient.GetAsync() dan Async/Await menyebabkan kebuntuan

Dalam .NET 4.5, apabila menggunakan kelas HttpClient bersama dengan corak async/await, mungkin terdapat isu di mana hasil httpClient.GetAsync(...) "menunggu" tergantung selama-lamanya dalam beberapa kes. Dalam kod yang disediakan, tingkah laku ini diperhatikan dalam kes "test5" dan menimbulkan persoalan sama ada terdapat pepijat dalam kelas HttpClient atau sama ada API sedang disalahgunakan.

Punca kebuntuan

Kebuntuan disebabkan oleh ketidakpadanan antara konteks benang dan mekanisme penyegerakan yang digunakan oleh corak async/await dan gelagat menyekat benang yang wujud bagi kaedah tertentu. Semasa menunggu Task dalam konteks permintaan ASP.NET, kaedah ini biasanya akan disambung semula pada SynchronizationContext yang ditangkap, memastikan bahawa konteks permintaan dikekalkan.

Walau bagaimanapun, dalam kes test5, AsyncAwait_GetSomeDataAsync memulakan operasi menyekat, iaitu HttpClient.GetAsync, sementara menunggu keputusan Test5Controller.Get. Ini menyekat urutan yang memiliki konteks permintaan, menghalang pemprosesan Task dalam konteks itu daripada selesai.

Amalan terbaik untuk menggunakan Async/Await dan HttpClient

Untuk mengelakkan situasi kebuntuan ini, amalan terbaik berikut disyorkan:

  • Gunakan ConfigureAwait(false) dalam kaedah async "perpustakaan" apabila boleh. Ini membolehkan kesinambungan dijalankan pada utas kumpulan benang biasa, memintas konteks permintaan ASP.NET.
  • Elakkan menyekat operasi Task sebaliknya, gunakan corak async/await di seluruh kod anda.

Dengan mematuhi amalan ini, anda boleh mencapai kedua-dua faedah menggunakan async/await: menjalankan kesinambungan pada urutan kumpulan benang yang berasingan tanpa memerlukan konteks permintaan ASP.NET dan memastikan pengawal itu sendiri tidak segerak untuk mengelakkan meminta benang daripada menyekat .

Atas ialah kandungan terperinci Kenapa `httpclient.getAsync ()` Deadlock dengan async/menunggu dalam .net 4.5?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan