Вызов службы WCF из клиента Silverlight с использованием потока без пользовательского интерфейса - PullRequest
1 голос
/ 03 ноября 2010

У меня довольно простой сценарий:
В моем приложении silverlight есть асинхронные вызовы службы WCF.
Я хочу выполнить их в отдельном потоке (или аналогичном), потому что они замораживают мой пользовательский интерфейс.
Все сервисные вызовы предназначены для обновления ViewModel, таким образом, элемента управления пользовательского интерфейса / a на странице, поэтому необходимо найти способ сделать это из потока, выполняющего сервисные вызовы, без получения знакомого межпоточного исключения. Какие-либо предложения?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

Разговаривая с ребятами из команды WCF, я понимаю, как это работает.Если вы просто сделаете вызов из фонового потока, он не будет работать, так как подсистема WCF перенаправит вызов обратно в поток, из которого вы изначально открыли соединение (обычно поток UI).Итак, вам нужно создать рабочий поток, а затем явно открыть соединение из этого потока .Затем, всякий раз, когда вы делаете вызов, он отправляется обратно в этот поток.И, конечно же, после того, как вы получили обратный вызов и выполнили свою обработку (в фоновом потоке), убедитесь, что все изменения пользовательского интерфейса перенесены обратно в поток пользовательского интерфейса с помощью Dispatcher.BeginInvoke ().

0 голосов
/ 04 ноября 2010

Dispatcher.BeginInvoke - лучшее решение.

Частичное определение прокси сервиса:

public void GetItemById(int id, Action<ItemModel> callback)
{
    AsyncCallback onCompleted = ar => 
        Deployment.Current.Dispatcher.BeginInvoke(() => 
            callback(this.Channel.EndGetItemById(ar)));
    this.Channel.BeginGetItemById(id, onCompleted, null);
}

Звонок из MVVM:

var proxy = new MyServiceProxy();
proxy.GetItemById(5, item => this.Item = item);
0 голосов
/ 03 ноября 2010

Вы можете либо использовать BackgroundWorker , либо заставить свой прокси-клиент поддерживать Асинхронный шаблон .

Убедитесь, что вы отправляете обновления пользовательского интерфейса в соответствующий поток, как описано здесь: http://russelleast.wordpress.com/2010/02/27/using-wcf-async-pattern-with-silverlight-3/

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