我在WPF应用程序的构造函数中运行了一个等待的函数:
Task.Run(async () =>
{
var r = await checkValidLicenseAsync(hardwareid);
if (r == false)
MessageBox.Show("no License.");
}
该消息框未阻止我的主窗口。我认为这是因为我执行任务吗?什么是解决方法?
答案 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>
答案 1 :(得分:-1)
我认为您不能将等待的方法调用到构造函数中。由于构造函数无法添加异步描述符。您可以在构造函数中调用委托。只需将您的逻辑包装到异步委托中