2015-04-04 6 views
2

Эффективно ли создавать фоновый поток в службе WCF, размещенной в Windows Service?Фоновые потоки в WCF

Что-то вроде этого:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class Service : IService 
{ 
    private void DoWork() 
    { 
    ... 
    } 

    public Service() 
    { 
     Thread thread = new Thread(new ThreadStart(DoWork)); 
     thread.Start(); 
    } 
} 
+1

Нет, я бы рекомендовал просто использовать ** сервисную модель ** для каждого вызова. Каждый запрос получает свою собственную копию класса обслуживания, вызываемый метод службы, и затем экземпляр снова освобождается. Это не мешает вам справляться с серьезными проблемами безопасности потоков и тому подобное –

+0

Моя служба работает и слушает по сети и отправляет сообщения на сервер MVC через веб-интерфейс. Для службы для каждого вызова мне нужно создать фоновый поток в MVC и дуплексную связь. Поэтому я предпочитаю создавать фоновый поток в WCF и передавать сообщения в MVC. Не могли бы вы объяснить, почему это плохая практика? – Michael

+0

Что будет делать эта фоновая нить? Зачем это нужно? – usr

ответ

1

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

Помните, что рабочие процессы IIS могут быть отключены в любой момент времени по причинам, которые вы не можете контролировать. Кроме того, рабочие процессы могут перекрываться при переработке. Это означает, что в одном и том же поле два экземпляра этого потока могут работать одновременно. То же самое верно, если вы хотите запустить это приложение на нескольких машинах по причинам HA.

Услуги Windows более стабильны, но они также должны быть перезапущены (например, при развертывании или при наличии ошибки, которая приводит к сбою процесса).

Также убедитесь, что уловили ошибки, которые происходят в этой теме. Необработанное исключение убивает процесс без уведомления разработчика.

Поскольку вы размещены в службе Windows, я не вижу причин поддерживать поток в конструкторе класса Service. Поддерживать состояние вне WCF. Например, в вашем классе обслуживания Windows.

+0

Причина, я создаю поток в WCF, что я смогу его убить и создать новый через интерфейс WCF. Например: public void StopListening() {thread.Abort();} и public void StartListening() {thread = new Thread (новый ThreadStart (DoWork)); tread.start(); } ... – Michael

+1

Вы можете сделать то же самое, если сохраните эту тему где-то в другом месте. Не нужно возиться с режимами запуска WCF. Также обратите внимание, что thread.abort является злым. Это не жизнеспособная архитектура. – usr

Смежные вопросы