在我的基于MVVM的Wix Managed Bootstrapper应用程序中,在处理不同的事件时,我试图向用户显示一个视图以获得一些输入。看起来Burn事件正在异步执行,因为使用Dispatcher.Invoke(),它正在跳过或通过视图并命中最后一个事件,即不等待此输入任务完成。
这是在击中最后一个之前需要完成的事件处理程序:
请注意,当弹出MessageBox.Show时,它会等待我们关闭它。在调试时,我看到它实际上切换到MissingSourceView并加载了MissingSourceViewModel,但随后跳过它,并执行ApplyComplete();
BootstrapperApplication.ResolveSource += (sender, e) => {
System.Windows.Forms.MessageBox.Show("Inside ResolveSource");
WixBootstrapperData.CurrentDispatcher.Invoke(((Action)(() =>
{
WixBootstrapperData.CurrentViewModel = new MissingSourceViewModel(WixBootstrapperData, InfoMessage);
})));
};
BootstrapperApplication.ApplyComplete += (sender, e) =>
{
WixBootstrapperData.BootstrapperApplicationModel.FinalResult = e.Status;
WixBootstrapperData.CurrentDispatcher.Invoke((Action)(() =>
{
InfoMessage = AppResource.MsgFinished;
WixBootstrapperData.CurrentViewModel = new FinishViewModel(WixBootstrapperData, InfoMessage);
}
));
};
我想,我应该在ResolveSource()中使用await和async,但我遇到如下错误:
错误CS1061' BaseViewModel'不包含的定义 ' GetAwaiter'没有扩展方法' GetAwaiter'接受第一个 类型的论点'任务'可以找到(你错过了使用 指令或程序集引用?)
知道如何让它等待在ResolveSource()内部完成然后跳转到它想要的地方吗?
答案 0 :(得分:0)
使用此功能,请告知是否可以解决您的问题。
WixBootstrapperData.CurrentDispatcher.Invoke(((Action)(() =>
{
Task.Factory.StartNew(() => {
WixBootstrapperData.CurrentViewModel = new MissingSourceViewModel(WixBootstrapperData, InfoMessage);
}).RunSynchronously();
})));