Служба Windows, которая будет работать каждый час - PullRequest
6 голосов
/ 07 апреля 2010

Я могу собрать службу Windows и установить ее.

Мне интересно, как я могу запускать эту услугу каждый час? Я хочу, чтобы он периодически запускался каждый час.

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

Как я могу это сделать?

Редактировать: Эта служба будет установлена ​​на многих машинах, поэтому я не хочу создавать запланированные задачи, скажем, на 100 серверах.

Ответы [ 7 ]

12 голосов
/ 07 апреля 2010

Если вы хотите, чтобы задача выполнялась с регулярным интервалом, а не постоянно, вам следует использовать Планировщик задач .

Если вам нужен код для обслуживания,но, чтобы быть «активированным» каждый час, самый простой подход состоял бы в том, чтобы сделать ваш сервис COM-объектом и назначать на него простую задачу, каждый час вызывающую jscript / vbscript, который создает ваш COM-объект и вызывает простой метод для него.

Альтернативой является использование любого из API-интерфейсов ожидания, чтобы «тратить» час без использования циклов.

Обратите внимание, что вам также необходимо учитывать некоторые интересные конструктивные решения, которые зависят от сценария:

  • как будет запускаться ваша служба, если она выйдет из строя или будет остановлена ​​пользователем?
  • если вы запустились более чем через час, должны ли вы снова работать или вам нужнождать, чтобы перейти на точное часовое расписание?
  • как вы отслеживаете последнее время «активации», если часовой пояс или летнее время имеет chЕсли вы не были активны?
  • Служба не позволяет вашему компьютеру переходить в спящий режим / режим гибернации на холостом ходу или когда крышка ноутбука закрыта?если нет, то нужно ли вам разбудить компьютер в час, чтобы ваша служба работала по вашему расписанию?

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

3 голосов
/ 07 апреля 2010

Есть несколько вариантов.

  1. Вы можете спать в течение часа.
  2. Возможно, вы лучше подходите для запланированной задачи, а не для службы.
3 голосов
/ 07 апреля 2010

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

Обработка планировщика заданий Managed Wrapper может помочь вам установить этопрограммно;Вы также можете использовать Google для других ресурсов.

2 голосов
/ 07 апреля 2010

Thread.Sleep() решение будет гарантировать, что ваша служба будет работать с интервалом в один час, а не каждый час, т. Е. Каждая задача будет запущена в 1 час + время для ее запуска. Подумайте об использовании Таймера в вашем сервисе. Это будет более надежное решение, поскольку у вас есть контроль, когда запускать задачу, следить за ее ходом и т. Д. Просто помните, что каждое событие Timer будет запускаться в отдельном потоке, и если задача запускает вас дольше одного часа возможно, придется ждать завершения первой задачи, чтобы избежать одновременных задач.

2 голосов
/ 07 апреля 2010
Thread.Sleep(TimeSpan.FromHours(1));

код, более читаемый таким образом

2 голосов
/ 07 апреля 2010
Thread.Sleep(1000*60*60);
0 голосов
/ 07 ноября 2011

Планировщики задач могут быть хорошей идеей, но сервисы предназначены для этого. Службы легко устанавливаются и правильно регистрируются. Все, что вам нужно сделать, это то, что при запуске службы вы можете установить системный таймер (System.Threading.Timer) или еще один таймер.

...