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