簡體   English   中英

調用Task.Result時Windows窗體中斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM