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:
ConfigureAwait(false)
dalam kaedah async "perpustakaan" apabila boleh. Ini membolehkan kesinambungan dijalankan pada utas kumpulan benang biasa, memintas konteks permintaan ASP.NET. 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!