我試圖在非阻塞異步函式中多次呼叫 GetAsync。令我驚訝的是,只有第一個電話被執行。所有請求都發往同一個域,所以我認為重用HttpClient. 為什么只執行第一個請求,我應該如何重寫代碼?
private static HttpClient client = new HttpClient(new HttpClientHandler(){UseProxy = false});
private static async Task NonblockingGet(string destination){
client.Timeout = TimeSpan.FromSeconds(10);
var result = await client.GetAsync(destination);
// handle result
}
private static void CallMultipleTimes(){
NonblockingGet("domain1/url1"); // only this one is executed
NonblockingGet("domain1/url2");
NonblockingGet("domain1/url3");
}
//main
ManualResetEvent mre = new ManualResetEvent(false);
CallMultipleTimes();
mre.WaitOne();
uj5u.com熱心網友回復:
不,所有三個呼叫NonblockingGet都已執行。但是在第二次呼叫中,您正在嘗試client在已經啟動請求之后修改(即設定超時)。這是不允許的,它會引發System.InvalidOperationException例外(被靜默忽略)
此實體已啟動一個或多個請求。只能在發送第一個請求之前修改屬性。
因此,當然client.GetAsync()不執行第二個和第三個。
將 移動client.Timeout = TimeSpan.FromSeconds(10);為第一個陳述句CallMultipleTimes()(或在第一個請求之前只執行一次的其他地方),一切都會按預期作業(至少對于這個用例)。
private static async Task NonblockingGet(string destination){
// client.Timeout = TimeSpan.FromSeconds(10); // <--- remove it here
var result = await client.GetAsync(destination);
// handle result
}
private static void CallMultipleTimes(){
client.Timeout = TimeSpan.FromSeconds(10); // <--- add it here
NonblockingGet("domain1/url1"); // only this one is executed
NonblockingGet("domain1/url2");
NonblockingGet("domain1/url3");
}
uj5u.com熱心網友回復:
我不明白為什么只執行第一個呼叫(我自己嘗試了代碼并且所有這些都被正確呼叫)。但是通常您不想將執行緒等待與異步代碼混合使用。并且您希望在任務中等待和執行所有異步操作(用于正確的例外處理)。
這是我的提議
HttpClient client = new HttpClient(new HttpClientHandler() { UseProxy = false});
async Task NonblockingGet(string destination)
{
client.Timeout = TimeSpan.FromSeconds(10);
var result = await client.GetAsync(destination);
// handle result
}
async Task CallMultipleTimes() =>
await Task.WhenAll(NonblockingGet("domain1/url1"), NonblockingGet("domain1/url2"), NonblockingGet("domain1/url3"));
// Main
await CallMultipleTimes();
// If you are here all 3 operations requests are completed
注意:如果您使用的是 .Net < 6.0,則必須將 Main 函式簽名從靜態 void 更改為靜態異步任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/406953.html
標籤:
