Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务。延迟永远不会完成_C#_.net_Task Parallel Library_Async Await_Delay - Fatal编程技术网

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);
}