2

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

4

2 回答 2

2

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

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

于 2012-06-24T16:16:13.583 回答
1

task.Wait() 阻塞直到任务完成,而 await 继续处理。我的猜测是,因为 UI 被阻止,消息对话框无法出现。

于 2012-06-24T15:50:06.473 回答