[英]Windows form breaks when calling Task.Result
我的代碼類似於以下Windows窗體中的代碼:
private async Task<string> GetGreetingAsync()
{
return await Task.Run(() => "Hello");
}
private void button1_Click(object sender, EventArgs e)
{
var x = GetGreetingAsync().Result;
}
單擊該按鈕會導致整個Windows窗體凍結並無響應。 沒有異常被拋出。
即使我沒有直接在事件處理程序中使用任務.Result
而且整個async
標記代碼在某些類庫函數中,它提供了沒有async
接口,問題仍然存在。 這種類庫的單元測試沒有任何問題,但是當我從Windows窗體上的事件處理程序調用它的函數時,它會中斷並且不響應。
為什么會這樣? 我該如何解決?
您正在使用.Result;
阻止UI線程.Result;
(請參閱ConfigureAwait
)
private async Task<string> GetGreetingAsync()
{
return await Task.Run(() => "Hello").ConfigureAwait(false);
}
private void button1_Click(object sender, EventArgs e)
{
var x = GetGreetingAsync().Result;
}
或者一路走異步
private async Task<string> GetGreetingAsync()
{
return await Task.Run(() => "Hello");
}
async private void button1_Click(object sender, EventArgs e)
{
var x = await GetGreetingAsync();
}
使用此版本,您甚至無需等待 GetGreetingAsync
private Task<string> GetGreetingAsync()
{
return Task.Run(() => "Hello");
}
async private void button1_Click(object sender, EventArgs e)
{
var x = await GetGreetingAsync();
}
您應該在Task<T>
上使用await
而不是Result
來獲得非阻塞行為。
private async void button1_Click(object sender, EventArgs e)
{
var x = await GetGreetingAsync();
}
調用Result
導致代碼等待,直到Task
完成,其中調用await
允許使用異步行為。
編輯
如果你正在做的話,實際上再看看你的代碼
private async Task<string> GetGreetingAsync()
{
return await new Task<string>(() => "Hello");
}
這真的不需要。 那塊就可以了
private Task<string> GetGreetingAsync()
{
return new Task<string>(() => "Hello");
}
返回任務的東西不需要async
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.