WPF:如何调用Dispatcher.Invoke()同步?

时间:2016-10-03 19:38:08

标签: wpf asynchronous mvvm wix bootstrapper

在我的基于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()内部完成然后跳转到它想要的地方吗?

1 个答案:

答案 0 :(得分:0)

使用此功能,请告知是否可以解决您的问题。

        WixBootstrapperData.CurrentDispatcher.Invoke(((Action)(() =>
        {
           Task.Factory.StartNew(() => {
              WixBootstrapperData.CurrentViewModel = new MissingSourceViewModel(WixBootstrapperData, InfoMessage);
           }).RunSynchronously();
        })));