Блокировка приложения WPF при отправке / получении сообщений нескольким службам WCF (MVVM) - PullRequest
0 голосов
/ 22 декабря 2010

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

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

Клиенты отправляют сообщения каждые 15 секунд на сервер,По команде Сервер отправляет сообщения Клиентам (по одному за раз).Теоретически Сервер может постоянно получать сообщения от нескольких Клиентов, поэтому его необходимо масштабировать как веб-сервер, сохраняя при этом отзывчивость пользовательского интерфейса.

Проблема в том, что через некоторое время мой пользовательский интерфейс блокируется, иногда на Сервере, иногда наКлиент.Я почти уверен, что это связано с WCF (там также происходит много других вещей).

Если я попытаюсь отправить сообщение, создав канал (через channelfactory), отправив сообщение и затем закрывФабрика каналов: отправка сообщения занимает минуту (в то время как пользовательский интерфейс в обоих приложениях заблокирован).Если я отключу channelFactory.close() после отправки сообщения, то сообщения будут отправлены сразу же.

Созданная мной служба имеет [OperationContract(IsOneWay = true)] для метода SendMessage.Реализация моего сервиса имеет [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)].

Почему мое сообщение отправляется в течение минуты при использовании channelFactory.close () в конце?

1 Ответ

2 голосов
/ 22 декабря 2010

В большинстве случаев не следует отправлять сообщение по сети в потоке пользовательского интерфейса.Это то, что заставляет ваше приложение блокироваться.Я не могу понять, почему ваши вызовы веб-службы занимают 1 минуту - возможно, что поток пользовательского интерфейса ставится в очередь с сообщениями .Давайте сначала исправим проблему с потоками и посмотрим, улучшит ли это время запроса.

Вам не нужно беспокоиться о получении сообщений, потому что WCF раскручивает поток для получения и обработки сообщения, но при отправке поток будет блокироваться до тех пор, пока сообщение не будет отправлено и подтверждено .

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

Task t = Task.Factory.StartNew(() =>
{
    //Do web service call here
});

Если вам необходимо обновить пользовательский интерфейс после отправки сообщения, следуйте приведенному выше коду, например, так:

Task UITask= t.ContinueWith(() =>
{
 this.TextBlock1.Text = "Complete"; 
}, TaskScheduler.FromCurrentSynchronizationContext());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...