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

时间:2012-06-24 15:41:59

标签: c# .net windows-runtime async-await

我不知道在等待任务和使用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(),我已经成功地使用了其他异步方法。)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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