Длительный сервис с отслеживанием состояния в .NET - PullRequest
9 голосов
/ 11 марта 2010

Мне нужно создать службу в .NET, которая поддерживает (внутреннее) состояние в памяти, порождает несколько потоков и, как правило, долго работает.Есть много вариантов -

  • Старый добрый Windows Service
  • Windows Communication Services
  • Windows Workflow Foundation

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

С одной стороны, важно, чтобы узел службы был как можно ближе к «простой работе», что исключает службу Windows.С другой стороны, важно, чтобы служба не была отключена хостом только потому, что нет внешней активности, что делает WCF своего рода «страшным».Что касается WF, то ее сильной стороной является возможность создавать процессы в виде ... рабочих процессов, а это то, что мне не нужно и не нужно.

Подводя итог, множество технологий MicrosoftЯ немного запутался.

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

Спасибо,
Asaf

PS,
Я использую .NET 4.

РЕДАКТИРОВАТЬ:

  • То, что я имею в виду под «просто работающим» хостом, это, например, то, что созданная мной служба будет реактивирована в случае сбоя.
  • Полагаю, причина этого вопроса в том, что я создавал службы Windows в прошлом (я думаю, что это был простой C ++ с Win32 API), и я не хочу упустить что-то более простое, еслиесть такая вещь.

Спасибо за все ответы до сих пор!
Asaf.

РЕДАКТИРОВАТЬ 2:

Iбудет использовать службу Windows и может размещать в ней службу WCF, чтобы позволить другим процессам взаимодействовать с ней.

Спасибо,
Asaf

Ответы [ 6 ]

7 голосов
/ 11 марта 2010

На основании вашего описания, ваша лучшая ставка - # 1, старый добрый Windows Service. Вы можете назначить ему работу, она может работать столько, сколько вы хотите, и она может создавать потоки. Не уверен, что вы подразумеваете под «просто работать» или почему это приводит к тому, что служба Windows перестает работать.

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

WCF - это, по сути, удаленное взаимодействие .NET через Интернет, оно само по себе не обрабатывает долго выполняющиеся процессы. Workflow Foundation может обрабатывать длительные рабочие процессы , но только это.

3 голосов
/ 11 марта 2010

В соответствии с вашими требованиями "(внутреннее) состояние в памяти, порождает несколько потоков и, как правило, долго работает", на самом деле есть два варианта:

  1. Консольное приложение
  2. Служба Windows

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

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

В службе Windows могут использоваться как WCF, так и WF.

2 голосов
/ 11 марта 2010

Поскольку вам, похоже, не нужны какие-либо функции, связанные с рабочим процессом, я голосую за Durable Services в WCF. Это новое в .NET 3.5, и оно позволяет серверам WCF сохранять свое состояние в «хранилище персистентности» на основе провайдера, обычно это внутренняя база данных SQL Server (но есть и провайдер на основе файловой системы, и он расширяемый - вы можете написать самостоятельно, если это необходимо).

Посмотрите несколько отличных постов в блоге на эту тему:

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

WCF может быть размещен в IIS (со всеми его недостатками) или вы можете вставить свою службу WCF в службу Windows NT и запускать ее и запускать при загрузке машины, без входа в систему.

1 голос
/ 11 марта 2010

Я бы предложил хороший старый сервис Windows. Я написал много сервисов, использующих C # для этих целей. Они могут порождать темы, бегать вечно и хорошо спроектированы, чтобы делать то, что вы хотите. Вы можете создать службу Windows .net прямо в Visual Studio. Это один из типов проектов .net.

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

0 голосов
/ 11 марта 2010

Может проверить Quartz.Net ? Это скорее планировщик, но вы можете запускать задания и т. Д. В нескольких потоках. Я использовал это вместо службы Windows с большим успехом.

0 голосов
/ 11 марта 2010
  1. настолько «просто работает», насколько это возможно - исключая Windows Service ...
  2. не снят из-за бездействия ... страшно - WCF ...
  3. не нужно ни рабочего процесса, ни желания - Workflow Foundation ...

Кажется, что вариантов не так много, как хотелось бы в это верить! ; Р

  • Как насчет простого EXE-файла, который выполняет свою работу и который планируется через планировщик заданий Windows? Вы управляете многопоточностью из своего приложения. Это было бы так же просто, как консольное приложение.

РЕДАКТИРОВАТЬ Моим первым выбором будет и служба Windows, но через планировщик это проще.

...