WCF, распараллеливающий - небыстро реагирующий UI

Я пытаюсь настроить некоторый материал WCF. В настоящее время у меня есть сервер, который позволяет удаленным пользователям загружать файлы и клиент. В сервере я использую класс ServiceHost. Я предполагаю, что это должно работать на отдельном потоке, однако, сервер, UI (WinForms) становится заблокированным, когда кто-то загружает файл. Существует ли способ управлять моделью потоков WCF?

Спасибо!

6
задан SharpAffair 1 June 2010 в 12:50
поделиться

3 ответа

"Из того же приложения Windows Form, если построить экземпляр ServiceHost до запуска потока UI, он будет выполняться в собственном потоке. Это означает, что рабочие потоки, выделенные из пула потоков, обрабатывают сообщения вместо цикла сообщений. Таким образом, службы действительно могут обрабатывать несколько одновременных запросов. "

1
ответ дан 9 December 2019 в 20:40
поделиться

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

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

Что я делаю в таких ситуациях, так это создаю службу Windows, размещающую WCF, и создаю ServiceContract для предоставления необходимых данных пользовательскому интерфейсу мониторинга. Этот пользовательский интерфейс будет работать независимо в своем собственном exe, будучи еще одним клиентом службы, получая данные от службы по мере необходимости.

Надеюсь, это имеет смысл для вас.

0
ответ дан 9 December 2019 в 20:40
поделиться

Вы должны добавить ServiceBehaviorAtttribute в класс, реализующий вашу службу, и установить для его свойства UseSynchronizationContext значение false. Это приведет к тому, что вызовы вашей службы будут обрабатываться в отдельном потоке.

Пример:

[ServiceBehavior(UseSynchronizationContext=false)]
class YourService : IYourService
{
  // Service Methods
}

Просто помните, что если вы собираетесь обновлять какие-либо элементы управления из своих методов службы, вы должны помнить о модели межпоточного программирования Windows Forms .

11
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: