Поток WCF - неотвечающий пользовательский интерфейс - PullRequest
6 голосов
/ 01 июня 2010

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

Спасибо!

Ответы [ 3 ]

11 голосов
/ 03 июня 2010

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

Пример:

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

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

1 голос
/ 01 июня 2010

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

0 голосов
/ 01 июня 2010

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

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

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

Надеюсь, для тебя есть смысл.

...