C# 任务。延迟永远不会完成
下面的代码将永远冻结C# 任务。延迟永远不会完成,c#,.net,task-parallel-library,async-await,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,它的行为与预期的
public async Task DoSomethingAsync()
{
await Task.Delay(2000);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DoSomethingAsync().Wait();
// Task.Delay(2000).Wait();
}
如果我用注释掉的代码将调用切换到
DoSomethingAsync
,它的行为与预期的一样。我怀疑嵌套等待以某种方式导致了死锁,但我不确定原因或如何修复它。假设在GUI
线程中运行Button\u Click
,您就有了死锁
当您在任务上使用Wait
时,您正在同步阻塞线程,直到任务结束,但任务永远不会结束,因为延续(完成task.Delay(2000);
)也必须在GUI线程上运行(在Wait上阻塞)。
您有几种解决方案。使用ConfigureAwait(false)
不捕获GUI线程的同步上下文:
public async Task DoSomethingAsync()
{
await Task.Delay(2000).ConfigureAwait(false);
}
或者(我建议)使用async void
事件处理程序(这是async void
方法的唯一合适位置):
我花了将近3小时才找到gui线程异步等待错误的原因。。。如果可以的话,我会给你两次机会!可能重复的
private async void Button_Click(object sender, RoutedEventArgs e)
{
await DoSomethingAsync();
}
public async Task DoSomethingAsync()
{
await Task.Delay(2000);
}