WPF: How to make Calls to Dispatcher.Invoke() Synchronous?

岁酱吖の 提交于 2019-12-25 09:20:37

问题


In my MVVM based Wix Managed Bootstrapper application, while handling different events, I'm trying to show the user a view to get some input. It looks like Burn events are executing Asynchronously because using Dispatcher.Invoke(), it is skipping or passing by the view and hitting the last event, i.e not waiting for this input task to finish.

Here is the event handler which needs to finish before hitting last one:

Please note that when MessageBox.Show is popped, it waits until we close it. While debugging, I see it actually switched to MissingSourceView and loaded MissingSourceViewModel, but then while skipping it, and executes 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);
                }
                ));
            };

I guess, I should use await and async with ResolveSource(), but I face errors like:

Error CS1061 'BaseViewModel' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'Task' could be found (are you missing a using directive or an assembly reference?)

Any idea how to make it wait for finishing inside ResolveSource() and then jump to wherever it wants?


回答1:


Use this, and please tell if this solves your problem.

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


来源:https://stackoverflow.com/questions/39839155/wpf-how-to-make-calls-to-dispatcher-invoke-synchronous

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!