c# - 调用 Task.Result 时 Windows 窗体中断

标签 c# winforms async-await

我的 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();
}

使用此版本,您甚至不需要在 GetGreetingAsyncawait

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/

相关文章:

c# - 在没有数据库连接的情况下使用 Entity Framework 类

javascript - 如何使用 RxJS 将 Promises 序列转换为 Rx.Observable?

c# - 为什么 Console.In.ReadLineAsync 会阻塞?

c# - 在自定义 ITemplate 中查找控件

C# 移动操作挂起而不是立即抛出异常

c# - 缩放以适合在 Winforms 面板 C# 中绘图

c# - 如何将 task.Wait(CancellationToken) 转换为 await 语句?

c# - 注释单元测试c#

c# - 如何删除 WP7 锁定屏幕上的音量控制?

c# - 如何将 Controller 用于局部 View ?