以下代码将永远卡住。
public async Task DoSomethingAsync()
{
await Task.Delay(2000);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DoSomethingAsync().Wait();
// Task.Delay(2000).Wait();
}
如果我将调用切换到带有注释掉的代码的 DoSomethingAsync
,它会按预期运行。我怀疑嵌套等待以某种方式导致了死锁,但我不确定原因或如何修复它。
最佳答案
假设 Button_Click
在 GUI
线程中运行,您遇到了死锁。
当您在任务上使用 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/