Событие против цикла while (true) - PullRequest
2 голосов
/ 03 октября 2011

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

В настоящее время я реализовал это, создав таймер и добавив ElapsedEventHandler. Событие срабатывает каждые t минут, и затем проверяется, что мы прошли настроенное время. Если это так, то действие выполняется, а если нет, то ничего не происходит.

Коллега спросил меня, не проще ли просто создать цикл while (true), содержащий sleep (), и, конечно же, ту же логику для проверки, истекло ли у нас время для действия.

Вопрос: Можно ли что-нибудь сказать о «устойчивости» события против времени (цикл)? Я думаю о ситуации, когда поток «умирает», поэтому цикл while (true) завершается. Это более «вероятно» произойдет в одном сценарии по сравнению с другим?

Ответы [ 2 ]

8 голосов
/ 03 октября 2011

Я бы проголосовал за ни одного.

Если ваша служба просто бездействует в течение всего дня, периодически просыпаясь (и отправляя код на пейджинг), чтобы увидеть, «пора ли работать», то это задачалучше подходит для Windows Task Scheduler .Вы можете программно установить задачу, чтобы запускать ее каждый день через планировщик задач.Тогда ваш код вообще не должен быть запущен, если только не пришло время его запускать.(Или, если ваша служба все равно должна работать в фоновом режиме, задача в планировщике может сигнализировать вашей службе о том, что она проснулась, а не о логике таймера).

0 голосов
/ 03 октября 2011

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

while(true)
{
   ...
   Thread.Sleep(1000);
}

замедлит ваш сервис при ответе на стандартные сервисные события, такие как OnStop.

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

Для подведения итогов: используйте таймер.

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