C# 运行阻止主窗口的全局Messagebox

C# 运行阻止主窗口的全局Messagebox,c#,wpf,C#,Wpf,我在WPF应用程序的构造函数中运行了一个等待的函数: Task.Run(async () => { var r = await checkValidLicenseAsync(hardwareid); if (r == false) MessageBox.Show("no License."); } messagebox没有阻止我的主窗口。我想这是因为我在执行任务?什么是变通方法?将此代码作为任务运行时,您期望得到什么?它在这方面没有任何

我在WPF应用程序的构造函数中运行了一个等待的函数:

  Task.Run(async () =>
  {
      var r = await checkValidLicenseAsync(hardwareid);
      if (r == false)
        MessageBox.Show("no License.");
  }

messagebox没有阻止我的主窗口。我想这是因为我在执行任务?什么是变通方法?

将此代码作为任务运行时,您期望得到什么?它在这方面没有任何优势。可能长时间运行的许可证验证已经通过
wait
调用,使其不受UI阻塞(除非其实现混乱)

要使消息框阻塞(即模式),只需编写

  bool valid = await checkValidLicenseAsync(hardwareid); // non-blocking
  if (!valid) {
      MessageBox.Show("no License."); // blocking
  }
假设这是
System.Windows.MessageBox
,而不是它的winforms挂件

一种可能的方法是使用工厂方法返回对象。另一种方法是使用所述的
AsyncLazy

另见:
-到。

我认为您不能将等待的方法调用到构造函数中。因为构造函数不能添加异步描述符。您可以在构造函数中调用委托。只需将逻辑包装到异步委托中

就可以在GUI线程上调用它。抛出异常,稍后处理并显示消息框。我如何在GUI线程上调用?不要使用task并使用ShowDialog来保持焦点。我无法在构造函数中运行异步函数“我如何在GUI线程上调用?”请用谷歌搜索,谢谢。我在构造函数中运行此代码。在构造函数中,我不能等待方法,构造函数应该始终保持对象完全初始化。另外,构造函数永远不会失败。好的,我想我必须将代码移动到主窗口的已加载事件