Я думаю, это действительно зависит от вашего требования.
дело 1.
Предположим, что вы хотите запускать this.ExecuteTask()
каждые пять минут, начиная с 12:00 (т.е. 12:00, 12:05, ...), и предположим, что время выполнения this.ExecuteTask()
варьируется (например, от 30 с до 2 min), возможно использование таймера вместо Thread.Sleep () кажется более простым способом сделать это (по крайней мере, для меня).
Однако вы можете добиться этого поведения также с помощью Thread.Sleep()
, рассчитав смещение, принимая временные метки при пробуждении потока и при завершении this.ExecuteTask()
.
, дело 2.
Предположим, что вы хотите выполнить задачу в следующие 5 минут сразу после завершения this.ExecuteTask()
, использование Thread.Sleep()
кажется более простым. Опять же, вы можете добиться этого поведения и с помощью таймера, сбрасывая таймер каждый раз, вычисляя смещения при каждом завершении this.ExecuteTask()
.
Примечание 1 , для случая 1 вы должны быть очень осторожны в следующем сценарии: что, если this.ExecuteTask()
иногда занимает больше периода (т.е. начинается в 12:05 и заканчивается 12:13 в приведенном выше примере).
Что это значит для вашего приложения и как оно будет обрабатываться?
а. Полный сбой - отменить службу или отменить текущее (12:05) выполнение в 12:10 и запустить выполнение 12:10.
б. Ничего страшного (пропустите 12:10 и запустите this.ExecuteTask()
в 12:15).
с. Ничего страшного, но нужно запускать выполнение в 12:10 сразу после завершения задачи в 12:05 (что, если это займет более 5 минут ??).
* * +1034 д. Необходимо запустить выполнение 12:10, даже если выполнение 12:05 выполняется в данный момент.
е. что-нибудь еще?
Для политики, которую вы выбрали выше, легко ли ваш выбор реализации (таймер или Thread.Sleep()
) поддерживать вашу политику?
Примечание2 . В .NET можно использовать несколько таймеров. Пожалуйста, ознакомьтесь со следующим документом (хотя он немного устарел, но кажется, что это хорошее начало): Сравнение классов таймеров в библиотеке классов .NET Framework