2010-02-16 3 views
4

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

Есть ли лучший способ, чем установить программу для спящего режима для max_integer секунд/милисекунд?

+1

Создает ли сервис, который просыпался бы раз в месяц? Разве не лучше создавать программу и планировать ее ежемесячно? Например, для этой задачи можно использовать встроенный планировщик Windows или nnCron (http://www.nncron.ru/). –

+1

У меня были хорошие результаты с запланированными задачами в Windows XP, Vista и Windows 7. –

ответ

16

Я бы не стал делать это как сервис Windows. Я бы запускал его как запланированную задачу.

Ваш сервис будет просто спать в течение месяца и является просто пустой тратой ресурсов. Пусть ОС отслеживает время и запускает ваше приложение для обработки раз в месяц.

4

Если вы не можете написать службу окон, вы упростите свою жизнь - запланированные задачи могут быть лучшим вариантом здесь. Службы Windows лучше всего использовать для вещей, где есть некоторая постоянная фоновая активность, которая должна произойти - не для запуска задач в течение длительного времени.

Однако, если вы должны сделать это службой Windows, то вы не хотите устанавливать тайм-аут ожидания с помощью таймера. Это определенно проблематичный подход. Что произойдет, если ваше приложение перезапустится? Как он узнает, как долго он спит? Или что, если поток перезапущен?

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

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

+0

Что произойдет, если ваше приложение будет перезапущено? Он считывает последнее время datetime проверки из реестра, , и если дельта от момента времени до времени реестра составляет> интервал, выполняет проверку, если <интервал, устанавливает текущий интервал в (interval- (nowtime-registrytime)), конечно, первая проверка здравомыслия были ли часы установлены или нет. –

+0

@ user155077: Вы, безусловно, можете делать то, что описываете, но там есть риск. Я бы предпочел использовать базу данных в качестве места хранения для этой информации, а не в реестре. Что произойдет, если произойдет катастрофический отказ сервера, и вам придется перестроить машину? Есть хороший шанс, что вы потеряете эту информацию в реестре. Это отдаленная возможность, но я видел, как это происходит. К сожалению, системный реестр редко восстанавливается. – LBushkin

+0

Также стоит упомянуть, что в зависимости от среды служба Windows может не работать в реестре. Лучше всего держать это в одном месте, например. базы данных. –

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