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_Click在GUI线程中运行,您的手就会陷入僵局.
当您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)