我的 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
标记的代码都在某个类库函数中,它提供的接口(interface)没有async
,问题依旧。此类库的单元测试没有任何问题地通过,但是当我从 Windows 窗体上的事件处理程序调用它的函数时,它中断并且没有响应。
为什么会这样?我该如何解决?
最佳答案
您正在使用 .Result;
阻塞 UI 线程(参见 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
中await
private Task<string> GetGreetingAsync()
{
return Task.Run(() => "Hello");
}
async private void button1_Click(object sender, EventArgs e)
{
var x = await GetGreetingAsync();
}
关于c# - 调用 Task.Result 时 Windows 窗体中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23036075/