Запросить навигацию пользовательского интерфейса с помощью PRISM 4 в асинхронном потоке ответов WCF - PullRequest
2 голосов
/ 20 декабря 2011

Я работаю над проектом, в котором используются следующие технологии:

  • 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;
        ...
    }

Как мне вызвать поток пользовательского интерфейса из события, которое вызывается в рабочем потоке?

1 Ответ

0 голосов
/ 10 января 2012

Вы можете использовать агрегатор событий призмы, чтобы убедиться, что вы находитесь в потоке пользовательского интерфейса. Смотрите здесь: http://neverindoubtnet.blogspot.com/2009/05/event-aggregator-in-prism-explorer.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...