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)