Я работаю над проектом, в котором используются следующие технологии:
- C # (.NET 4.0)
- WCF
- ПРИЗМА 4
В настоящее время я выполняю асинхронный вызов одной из наших веб-служб, используя методы Begin / End, сгенерированные прокси. Вызов выполнен успешно, и клиент может получить ответ веб-службы в рабочем потоке.
Как только ответ получен, я продолжаю поднимать событие. Класс, подписанный на событие, продолжает запрашивать навигацию пользовательского интерфейса, используя PRISM:
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri)));
Поскольку асинхронный ответ WCF не фиксируется в потоке пользовательского интерфейса, я вынужден вызывать поток пользовательского интерфейса с помощью Application.Current.Dispatcher.BeginInvoke (...).
Проблема здесь в том, что вызов, похоже, ничего не делает. Пользовательский интерфейс не обновляется, и исключение не выдается.
Класс, который пытается вызвать Invoke с помощью диспетчера, является View-моделью представления. Он создается с использованием инверсии управления (с контейнером UNITY).
Вот конструктор представления, который запрашивает его View-Model:
public CredentialsInputView(ICredentialsInputViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
...
}
Предыдущий код вызывает конструктор View-Model. Я пытался сохранить диспетчер в вызове конструктора виртуальной машины, но использование его для вызова навигации пользовательского интерфейса позже, похоже, не помогло. Я так понимаю, что View-Model не создается в потоке пользовательского интерфейса:
private static System.Windows.Threading.Dispatcher dispatcher;
/// <summary>
/// Initializes a new instance of the <see cref="CredentialsInputViewModel"/> class.
public CredentialsInputViewModel(ICodexLoginService codexLoginService, ISessionService sessionService, IRegionManager regionManager)
{
dispatcher = Application.Current.Dispatcher;
...
}
Как мне вызвать поток пользовательского интерфейса из события, которое вызывается в рабочем потоке?