我知道這沒有使用正確的形式,但是有人可以告訴我為什么第一個代碼片段有效而第二個代碼片段導致死鎖嗎?
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = DownloadStringV3("https://www.google.com");
}
public string DownloadStringV3(String url)
{
var resp = new HttpClient().GetAsync(url).Result;
return resp.Content.ReadAsStringAsync().Result;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = DownloadStringV3("https://www.google.com").Result;
}
public async Task<string> DownloadStringV3(String url)
{
var resp = await new HttpClient().GetAsync(url);
return await resp.Content.ReadAsStringAsync();
}
不同的同步背景關系?這是使用 .NET 4.8
uj5u.com熱心網友回復:
每次你await做某事時,你說,我暫時在這里完成,給其他執行緒一個執行的機會,然后在異步任務完成時從這里繼續。
因此,在您的情況下,await new HttpClient().GetAsync(url)切換 ui 執行緒并等待DownloadStringV3("https://www.google.com").Result完成,這將永遠不會發生,因為我們從不執行return await resp.Content.ReadAsStringAsync()。
這就是為什么你應該一直做異步到根并且永遠不要呼叫Result.
第一個代碼有效,因為您阻塞了 UI 執行緒并且在等待它時不要嘗試切換到另一個執行緒。
要使第二個作業,您需要:
private async void button1_Click(object sender, EventArgs e)
{
// make with try catch sure, you catch any error, async void is special. Better is async Task
textBox1.Text = await DownloadStringV3("https://www.google.com");
}
public async Task<string> DownloadStringV3(String url)
{
var resp = await new HttpClient().GetAsync(url);
return await resp.Content.ReadAsStringAsync();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/506403.html
下一篇:根據選擇有限的復選框更改行顏色
