Таймеры сервера - это существа, отличные от спящих потоков.
Во-первых, в зависимости от приоритета вашего потока и того, что еще выполняется, ваш спящий поток может быть или не быть активирован и запланирован для запуска с заданным интервалом. Если интервал достаточно велик и точность планирования не имеет большого значения, Thread.Sleep()
- разумный выбор.
Таймеры, с другой стороны, могут генерировать свои события в любом потоке, что позволяет улучшить возможности планирования. Однако стоимость использования таймеров немного сложнее в вашем коде - и тот факт, что вы не сможете контролировать, какой поток запускает логику, по которой запускается событие таймера. Из документов:
Серверный таймер предназначен для
использовать с рабочими потоками в
многопоточная среда. сервер
таймеры могут перемещаться между потоками в
обрабатывать поднятое событие Elapsed,
что приводит к большей точности, чем
Windows таймеры при поднятии события на
время.
Другое соображение заключается в том, что таймеры вызывают свой Elapsed делегат в потоке ThreadPool. В зависимости от того, насколько трудоемкой и / или сложной является ваша логика, вы можете не захотеть запускать ее в пуле потоков - вам может потребоваться выделенный поток. Еще один фактор, связанный с таймерами, заключается в том, что если обработка занимает достаточно много времени, событие таймера может быть снова вызвано (одновременно) в другом потоке, что может стать проблемой, если выполняемый код не предназначен или структурирован для параллелизма.
Не путайте Таймеры сервера с " Таймеры Windows ". Последнее обычно ссылается на сообщения WM_TIMER, которые могут быть доставлены окну, что позволяет приложению планировать и отвечать на обработку по времени в своем основном потоке без сна. Однако Windows Timers также может ссылаться на Win API для низкоуровневой синхронизации (что не совпадает с WM_TIMER).