代码之家  ›  专栏  ›  技术社区  ›  daniel

运行阻止主窗口的全局Messagebox

  •  -1
  • daniel  · 技术社区  · 6 年前

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

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   Olivier Jacot-Descombes    6 年前

    将此代码作为任务运行,您期望得到什么?它在这方面没有任何优势。已使用调用可能运行时间较长的许可证验证 await

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

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

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

    一种可能的方法是使用工厂方法返回对象。另一个是使用 AsyncLazy<T> 如上所述 here by Stephen Cleary

    另见: - Svick's answer Can constructors be async? .

        2
  •  -1
  •   Big Cash    6 年前

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