c# - Task.Delay 永远不会完成

标签 c# .net task-parallel-library async-await delay

以下代码将永远卡住。

public async Task DoSomethingAsync()
{
    await Task.Delay(2000);
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    DoSomethingAsync().Wait();
    // Task.Delay(2000).Wait();
}

如果我将调用切换到带有注释掉的代码的 DoSomethingAsync,它会按预期运行。我怀疑嵌套等待以某种方式导致了死锁,但我不确定原因或如何修复它。

最佳答案

假设 Button_ClickGUI 线程中运行,您遇到了死锁。

当您在任务上使用 Wait 时,您会同步阻塞线程直到任务结束,但任务永远不会结束,因为继续(Task.Delay(2000) 的完成;) 也必须在 GUI 线程上运行(在 Wait 时被阻止)。

您有多种解决方案。使用 ConfigureAwait(false) 不捕获 GUI 线程的 SynchronizationContext:

public async Task DoSomethingAsync()
{
    await Task.Delay(2000).ConfigureAwait(false);
}

或者(我推荐)使用 async void 事件处理程序(这是 async void 方法唯一合适的地方):

private async void Button_Click(object sender, RoutedEventArgs e)
{
    await DoSomethingAsync();
}

public async Task DoSomethingAsync()
{
    await Task.Delay(2000);
}

关于c# - Task.Delay 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24525559/

相关文章:

.net - 在 GUI 应用程序中处理 TaskScheduler.UnobservedTaskException 的推荐方法是什么?

c# - 从父子任务返回值

C# 打开文件的问题

c# - 在 app.config 文件中写入值

c# - 有一个 ComboBox 不是 "use"F4 键

c# - 如何在.NET中获取磁盘的分区UUID

c# - C# 的 FFT 误差

javascript - 如何在 jQuery 中使用 WCF 方法

c# - 用 && 链接方法

c# - 后台运行方法和UI Thread WPF