Многопоточный самодостаточный сервис WCF - PullRequest
6 голосов
/ 20 апреля 2011

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

Ответы [ 3 ]

10 голосов
/ 20 апреля 2011

Если вы самостоятельно размещаете службу в приложении пользовательского интерфейса с настройкой поведения службы по умолчанию, вы, вероятно, увидите поведение, которое вы описываете.Поведение службы по умолчанию использует контекст синхронизации.В случае запуска хоста службы в потоке пользовательского интерфейса (WinForms, WPF) все запросы направляются в общий цикл сообщений Windows => все запросы обрабатываются потоком пользовательского интерфейса последовательно.

В любом другом случае (включая вручнуюустановка [ServiceBehavior(UseSynchronizationContext = false)] для служб, размещенных в потоке пользовательского интерфейса), узел службы отправляет новый поток из пула потоков для каждого запроса.Существуют и другие различия, основанные на режиме контекста экземпляра и режиме параллелизма, но с настройками по умолчанию вы увидите поведение, которое я описал.

1 голос
/ 13 февраля 2012
[ServiceBehavior(UseSynchronizationContext = false)]

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

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

0 голосов
/ 20 апреля 2011

Я сам принимаю все - гарантированно, что он не однопоточный.Приведенный выше Commenter, вероятно, находится на правильном пути. Убедитесь, что если для атрибута ServiceBehavior в impl службы задано значение InstanceContextMode.Single, что вы также установили ConcurrencyMode.Multiple, иначе вы увидите только один поток.По умолчанию, если у вас нет атрибута ServiceBehavior, вы получите один экземпляр службы, подразумеваемый за вызов (InstanceContextMode.PerCall, ConcurrencyMode.Single).Также может быть связано с регулированием соединения, но, вероятно, вы будете знать, если вы настроите это в своей конфигурации.

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