c# - 如果我使用 Task.Wait() 而不是等待,则不会显示 MessageDialog 任务

标签 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 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/

相关文章:

C# WebSocketServer wss ://connection fail

c# - 在 tabcontainer 中启用 tabpanel

.net - 在 WebException 之后避免 ProtocolViolationException

c++ - 从 C++ Windows 应用商店应用程序使用 sqlite-winrt

windows-8 - 通过PID检测在WinRT模式下运行的应用程序

c# - Java 枚举与 C# 枚举 - 缺少的功能

c# - 如何读取GC420t打印机的状态?

c# - 我可以防止无效的小型转储文件名吗

.net - 在 WPF 或 winform 中绘制 3D 图形

c# - 如何在应用程序运行时更改 GridView.ItemTemplate?