2016-10-03 5 views
0

В моем MVVM-приложении Wix Managed Bootstrapper, обрабатывая разные события, я пытаюсь показать пользователю представление, чтобы получить некоторый ввод. Похоже, события записи выполняются асинхронно, потому что с помощью Dispatcher.Invoke() он пропускает или передает представление и попадает в последнее событие, то есть не дожидается завершения этой задачи ввода.
WPF: как сделать вызовы диспетчеру.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(), но я сталкиваюсь ошибки как:

CS1061 Ошибка 'BaseViewModel' не содержит определения для 'GetAwaiter' и ни один из методов расширения «GetAwaiter» принимая первый аргумент типа «Task» может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?)

Любая идея, как заставить его ждать завершения в ResolveSource(), а затем перейти туда, где он хочет?

+0

Вы можете выбрать ручной механизм синхронизации, такие как событие сброса: https://msdn.microsoft.com/en-us/library/system.threading.manualresetevent%28v=vs.110%29.aspx ? f = 255 & MSPPError = -2147217396 – sondergard

ответ

0

Используйте это и, пожалуйста, сообщите, разрешило ли оно вашу проблему.

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

сбой со следующим исключением: System.InvalidOperationException: RunSynchronously может не вызываться в задаче, которая уже была запущена. –

+0

CurrentDispatcher это работает грузоотправитель и Invoke запускает еще одну операцию на том же диспетчерский нить .. –

+0

@FarrukhWaheed см обновленный ответ – AnjumSKhan