Длительные службы Windows - PullRequest
1 голос
/ 12 апреля 2009

Люди,

Я хочу разработать долгосрочную службу Windows (она должна работать без проблем в течение нескольких месяцев), и мне интересно, какой вариант лучше здесь:

  1. Использовать цикл while (true) в методе OnStop
  2. Используйте таймер, чтобы отмечать каждые n секунд и запускать мой код
  3. Есть ли другие варианты?

Спасибо Essam

Ответы [ 7 ]

6 голосов
/ 12 апреля 2009

Все, кроме # 1
Менеджер служб (или пользователь, если он активирует элементы управления) ожидает, что OnStart() и OnStop() вернутся своевременно.
Обычно это делается для того, чтобы запустить свой собственный поток, который постоянно работает и, конечно, слушает событие, которое может заставить его остановиться.

6 голосов
/ 12 апреля 2009

Я бы не стал делать # 1.

Я бы либо сделал # 2, либо я бы выделил отдельный поток во время OnStart, который выполняет реальную работу.

4 голосов
/ 12 апреля 2009

Возможно, стоит рассмотреть запланированное задание с коротким интервалом. Экономит время при написании большого количества кода и учитывает особенности Таймеров Windows Services .

2 голосов
/ 14 апреля 2009

Не связывайтесь с кодом сервисного контроллера. Если служба захочет остановиться, вы только усугубите ситуацию, используя # 1. И кстати, сервис всегда может дать сбой , и в этом случае ваше время (true) вам ничем не поможет.

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

1 голос
/ 12 апреля 2009

Я бы НЕ рекомендовал # 1.

То, что я делал в прошлом для точно такого же сценария / ситуации, - это создание запланированного задания, которое выполняется раз в N секунд, запускает небольшой скрипт, который просто выполняет эти 2 вещи: # 1 проверяет флаг «IsAlreadyRunning» который читается из базы данных) # 2 Если флаг имеет значение true, то скрипт немедленно останавливает завершение работы. Если флаг имеет значение false, сценарий запускает отдельный процесс (exe) в новом потоке (который использует службу для выполнения задачи, которая может быть очень короткой или иногда очень длинной, в зависимости от количества обрабатываемых записей). Этот процесс, конечно, устанавливает и сбрасывает флаг IsAlreadyRunning, чтобы потоки не запускали перекрывающиеся действия. У меня есть сервис, который работает уже много лет с этим подходом, и у меня никогда не было проблем с ним. Мой основной процесс использует веб-сервис и кучу других вещей для выполнения некоторых тяжелых операций резервного копирования.

0 голосов
/ 13 апреля 2009

Это делает

1 задание на очистку или

2 просыпается и смотрит, нужно ли запускать задачу

Если это что-то вроде # 2, то использование MSMQ было бы более уместным. С MSMQ задача будет выполнена почти сразу.

0 голосов
/ 12 апреля 2009

Класс System.Threading.Timer может показаться подходящим для такого рода использования.

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