第一段,在form中會卡死form的執行緒,無法獲得結果
public async Task<string> Test(string url)
{
try
{
var webclient = new WebClient();
var res = await webclient.DownloadStringTaskAsync(url);
return res;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
private void Button1_Click(object sender, EventArgs e)
{
var dd =Test("http://127.0.0.1:5000/swagger/v1/swagger.json").Result;
Console.WriteLine(dd);
}
第二段,可以在form中獲得結果,但是不理解為啥要怎么做
public async Task<string> Test(string url)
{
try
{
var webclient = new WebClient();
var res = await webclient.DownloadStringTaskAsync(url);
return res;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
private void Button1_Click(object sender, EventArgs e)
{
var dd = Task.Run(()=>Test("http://127.0.0.1:5000/swagger/v1/swagger.json")).Result;
Console.WriteLine(dd);
}
uj5u.com熱心網友回復:
.Result;這是同步代碼至于第2個說實話,別扭。如果對比下面的代碼的話
private async void Button1_Click(object sender, EventArgs e)
{
var dd = await Test("http://127.0.0.1:5000/swagger/v1/swagger.json"));
Console.WriteLine(dd);
}
uj5u.com熱心網友回復:
第一種會造成“死鎖”,因為在同步方法里呼叫了異步,Test的Result等待執行Button1_Click的執行緒A結束,以便執行await之后的return操作,而執行緒A同樣也等待著Result回傳結果,就導致他們倆同時等待。應盡量不要使用result屬性,內部會呼叫wait操作。在。netcore里不會存在這中死鎖問題,因為await的執行可能會在不同的執行緒上。第二種使用了Task.Run執行test方法,也就是 不是在執行Button1_Click的執行緒A上,而是從另一個執行緒執行,也就不用等待A執行完畢。不過這樣會發生背景關系切換,導致當前背景關系中的某些資訊丟失。也可能導致操作某些UI控制元件出現例外,因為已經出現了跨執行緒操作錯誤。這樣會立刻輸出dd的值。
對于第一種情況,可以修改為:await webclient.DownloadStringTaskAsync(url).ConfigureAwait(false);用來在其它執行緒上恢復執行await。
uj5u.com熱心網友回復:
我試了,不行...
uj5u.com熱心網友回復:
感覺沒什么區別。第二個有一種多此一舉的感覺。
uj5u.com熱心網友回復:
但是第一種會卡死執行緒,在framework下...
uj5u.com熱心網友回復:
第一段是同步運行,可以改成異步private async void Button1_Click(object sender, EventArgs e)
{
var dd = await Test("http://127.0.0.1:5000/swagger/v1/swagger.json");
Console.WriteLine(dd);
}
uj5u.com熱心網友回復:
在web里 沒區別 但是在 winform里就有區別了
第一種 執行 是會有卡住無回應的現象,因為是同步,
第二種就不會
uj5u.com熱心網友回復:
我前面在控制臺執行了以下,貌似也沒區別。
我去winform試試
uj5u.com熱心網友回復:
感覺沒什么區別。
第二個有一種多此一舉的感覺。
在web里 沒區別 但是在 winform里就有區別了
第一種 執行 是會有卡住無回應的現象,因為是同步,
第二種就不會
winform中執行還真不一樣。
第一個會死鎖
uj5u.com熱心網友回復:
第一種會造成“死鎖”,因為在同步方法里呼叫了異步,Test的Result等待執行Button1_Click的執行緒A結束,以便執行await之后的return操作,而執行緒A同樣也等待著Result回傳結果,就導致他們倆同時等待。應盡量不要使用result屬性,內部會呼叫wait操作。在。netcore里不會存在這中死鎖問題,因為await的執行可能會在不同的執行緒上。
第二種使用了Task.Run執行test方法,也就是 不是在執行Button1_Click的執行緒A上,而是從另一個執行緒執行,也就不用等待A執行完畢。不過這樣會發生背景關系切換,導致當前背景關系中的某些資訊丟失。也可能導致操作某些UI控制元件出現例外,因為已經出現了跨執行緒操作錯誤。這樣會立刻輸出dd的值。
對于第一種情況,可以修改為:await webclient.DownloadStringTaskAsync(url).ConfigureAwait(false);用來在其它執行緒上恢復執行await。
uj5u.com熱心網友回復:
感覺沒什么區別。
第二個有一種多此一舉的感覺。
在web里 沒區別 但是在 winform里就有區別了
第一種 執行 是會有卡住無回應的現象,因為是同步,
第二種就不會
winform中執行還真不一樣。
第一個會死鎖
因為是同步等待異步的執行結果, 所以會卡在click事件里
uj5u.com熱心網友回復:
同意六樓,加 awaitvar dd = await Test("http:/
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/124823.html
標籤:C#
