如果我使用Task.Wait()而不是await,则不显示MessageDialog任务

我不知道在等待任务和使用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块中显示一个对话框(显示错误信息)并等待用户在catch块之后继续关闭对话框(是的,我们可以在catch块中使用await但是我们可以使用Task.Wait(),我已经成功地使用了其他异步方法)。

显示对话框(并响应其中的按钮单击)必须从UI线程完成。 但是如果你在UI线程上调用Wait() ,你基本上就是说在该线程上没有其他任何事情可以发生,直到该Task完成。 这就是无法显示对话框的原因,这也是您的应用程序冻结的原因。

因此,UI线程正在等待对话框,但对话框正在等待UI线程,这是一个经典的死锁 。 我相信在UI线程上使用Wait()是C#5 GUI应用程序死锁的最常见原因。

task.Wait()阻塞,直到任务完成,等待继续处理。 我的猜测是,由于UI被阻止,因此无法显示消息对话框。