我不知道等待任务和使用 task.Wait() 之间的区别,但对于第一个 MessageDialog.ShowAsync 方法,它可以工作,但不能用于第二个(而这两种语法适用于其他异步方法)。
如果有人可以解释为什么我会感兴趣!
// this don't work, no dialog is shown (and UI is block)
var dialog = new MessageDialog("fail");
var task = dialog.ShowAsync().AsTask();
task.Wait();
// this work
var dialog = new MessageDialog("success");
var task = dialog.ShowAsync().AsTask();
await task;
你会问我为什么要这样做,因为我需要在 catch block 中显示一个对话框(以显示错误消息)并等待用户关闭对话框,然后再在 catch block 之后继续(并且是的,我们不能在 catch block 中使用await,但我们可以使用Task.Wait(),我已经成功地将它与其他异步方法一起使用了)。
最佳答案
显示对话框(并响应其中的按钮单击)必须从 UI 线程完成。但是,如果您在 UI 线程上调用 Wait()
,则基本上是说在该 Task
完成之前,该线程上不会发生任何其他事情。这就是无法显示对话框的原因,也是应用程序卡住的原因。
所以,UI线程正在等待对话框,但是对话框正在等待UI线程,这是一个经典的deadlock 。我相信在 UI 线程上使用 Wait()
是 C# 5 GUI 应用程序中死锁的最常见原因。
关于c# - 如果我使用 Task.Wait() 而不是等待,则不会显示 MessageDialog 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178764/