2011-12-20 5 views
9

Я работаю над проектом, который использует следующие технологии:Как вызвать метод в потоке пользовательского интерфейса из рабочего потока?

  • C# (.NET 4.0)
  • WCF
  • PRISM 4

Я в настоящее время делает асинхронный вызов к одному из наших веб-сервисов с использованием методов Begin/End, созданных прокси-сервером. Вызов успешный, и клиент может получить ответ веб-службы на рабочий поток.

Как только получен ответ, я продолжаю поднимать событие. Класс подписался на событие продолжает запрашивать интерфейс навигации с помощью PRISM:

Application.Current.Dispatcher.BeginInvoke(new Action(() => 
    this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri))); 

Поскольку асинхронный ответ WCF не захватывается в потоке пользовательского интерфейса, я вынужден вызвать поток пользовательского интерфейса с использованием Application.Current.Dispatcher.BeginInvoke(...).

Проблема заключается в том, что вызов, похоже, ничего не делает. Пользовательский интерфейс не обновляется, и исключение не генерируется.

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

Edit: Этот вопрос был вновь спросил по следующей ссылке, так как предполагается, дубликат не дает ответа:

Request UI navigation using PRISM 4 on an asynchronous WCF response thread

+2

Почему эта нить закрыта. Возможный дубликат не касается Windows WPF, и мне почти 3 года, и я понимаю, что это общий вопрос (на сайте), но возможный дубликат как НИЧЕГО. –

+0

Я согласен с Ramhound ... –

ответ

5

Вы должны убедиться, что вы ссылаетесь на фактическом UI Dispatcher , не обязательно Current. Вы можете попробовать пропустить в UI Dispatcher или иметь какую-то форму обратного вызова, которая будет обрабатываться интерфейсом пользователя где-то.

+0

Как я могу пройти мимо Диспетчера интерфейса? –

+1

Предполагая, что вы создаете класс, который требует его от некоторого элемента пользовательского интерфейса (т. Е. 'UserControl'), вы можете сделать что-то вроде:' var someClass = new SomeClass (this.Dispatcher); '. –

+0

@ HusseinKhalil - Не можете ли вы отправить ссылку главного окна? –

Смежные вопросы