Task.Run全局消息框将阻止主窗口

时间:2019-01-23 15:07:16

标签: c# wpf

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

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

该消息框未阻止我的主窗口。我认为这是因为我执行任务吗?什么是解决方法?

2 个答案:

答案 0 :(得分:0)

通过运行此代码作为任务,您期望什么?这里没有任何优势。可能已经运行很长时间的许可证验证已经通过await进行了调用,使其成为非UI阻止的对象(除非其实现被弄乱了)。

要使消息框处于阻塞状态,即模态,只需编写

  bool valid = await checkValidLicenseAsync(hardwareid); // non-blocking
  if (!valid) {
      MessageBox.Show("no License."); // blocking
  }

假设这是System.Windows.MessageBox,而不是它的winforms吊坠。

一种可能的方法是使用工厂方法返回对象。另一个是使用here by Stephen Cleary

中所述的AsyncLazy<T>

另请参阅: -Svick's answerCan constructors be async?

答案 1 :(得分:-1)

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