Task.Delay永远不会完成

Mat*_*lay 14 .net c# delay task-parallel-library async-await

以下代码将永远冻结.

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

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

如果我DoSomethingAsync使用注释掉的代码切换调用,它的行为与预期一致.我怀疑嵌套等待导致死锁,但我不知道为什么,或者如何解决它.

i3a*_*non 29

假设Button_ClickGUI线程中运行,您的手就会陷入僵局.

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

你有几个解决方案.要么使用ConfigureAwait(false)不捕获GUI线程的SynchronizationContext:

public async Task DoSomethingAsync()
{
    await Task.Delay(2000).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

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

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

public async Task DoSomethingAsync()
{
    await Task.Delay(2000);
}
Run Code Online (Sandbox Code Playgroud)

  • 花了我将近3小时的时间来找到gui-thread-async-await错误的原因...如果可以的话,我会给您两个提示! (2认同)