我注意到當我使用一個單一的靜態實例HttpClient,我的代碼掛起,並退出幾分鐘後出現錯誤 - 只是說其中一個任務被取消,沒有給出具體的錯誤。多次調用靜態httpclient掛起控制檯應用程序
static HttpClient _client = new HttpClient();
static void Main(string[] args)
{
try
{
var t1 = _client.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t1.Wait();
Console.WriteLine("complete");
var t2 = _client.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t2.Wait();
Console.WriteLine("complete");
var t3 = _client.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t3.Wait();
Console.WriteLine("complete");
var t4 = _client.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t4.Wait();
Console.WriteLine("complete");
Console.ReadKey();
}
catch (System.Exception ex)
{
}
}
當我切換到下面的代碼並創建單獨的HttpClient實例時,問題就消失了。
static void Main(string[] args)
{
try
{
HttpClient client1 = new HttpClient();
var t1 = client1.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t1.Wait();
Console.WriteLine("complete");
HttpClient client2 = new HttpClient();
var t2 = client2.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t2.Wait();
Console.WriteLine("complete");
HttpClient client3 = new HttpClient();
var t3 = client3.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t3.Wait();
Console.WriteLine("complete");
HttpClient client4 = new HttpClient();
var t4 = client4.GetStreamAsync("http://www.w3.org/TR/PNG/iso_8859-1.txt");
t4.Wait();
Console.WriteLine("complete");
Console.ReadKey();
}
catch (System.Exception ex)
{
}
}
我想先知道爲什麼發生這種情況,如果有一種方法可以安全地使用靜態的HttpClient多次,我在第一個代碼塊(沒有必要的,只是出於好奇)
不錯。在控制檯應用程序中,'ConfigureAwait(false)'建議是多餘的,因爲沒有SynchronizationContext需要捕獲並繼續。在其他應用程序模型中,這是至關重要的建議,或者在圖書館的良好實踐中。 – Stuart
你是對的!感謝您的改進。 –
第一個變體遇到了我最初的相同問題,它完成第一個和第二個任務,然後掛起一兩分鐘,拋出異常。第二種變化是完美的。我認爲第一個更像'使用(HttpClient _client = new HttpClient()) {t1} = _client.GetStreamAsync(「http://www.w3.org/TR/PNG/iso_8859-1.txt」 ); t1.Wait(); Console.WriteLine(「complete」); }' – erotavlas