Почему служба Windows не работает должным образом с System.Timers.Timer или System.Windows.Forms.Timer - PullRequest
7 голосов
/ 09 февраля 2012

Недавно мне пришлось написать службу Windows.Мне нужно было периодически запрашивать URL и проверять его наличие.Для этого я решил инициализировать таймер в методе службы OnStart и выполнить всю работу в событии timer_Tick.

Мой первый подход - использовать System.Windows.Forms.Timer и его событие Tick.Я выбрал его из-за учебника, который я читал.Как-то не смог заставить сервис работать.Он установился и запустился без проблем, но не вызвал событие (я подключил отладчик к процессу и увидел, что он не запущен).Я подумал, что, возможно, использование таймера форм в службе Windows не очень хорошая идея, поэтому я решил переключиться на System.Timers.Timer и использовать событие Elapsed.Это тоже не сработало.Я попробовал оба упомянутых подхода в приложении Windows Forms, и они оба работали.

После некоторого поиска я нашел этот сайт: http://weblogs.asp.net/sibrahim/archive/2004/01/13/58429.aspx, на котором блоггер рекомендует использовать еще один таймер: System.Threading.Timer,Я изменил подход в третий раз, и BOOM он начал работать как чудо.

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

Ответы [ 2 ]

8 голосов
/ 09 февраля 2012

Таймер System.Windows.Forms.Timer использует насос сообщений пользовательского интерфейса для упорядочения события тика, служба по умолчанию не запускает насос сообщений, поэтому без небольшой дополнительной работы таймеры System.Windows.Forms.Timer не будут работать.

System.Timers.Timer - это серверный таймер, который вызывает событие в потоке, в котором вы его создаете (я думаю).Если это не работает, возможно, вы не запускаете таймер или таймер запускается в потоке, который немедленно заканчивается (как, например, ничто не поддерживает работу потока, поэтому он завершается).

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

Таймер System.Threading.Timer использует обратный вызов, который выполняется в потоке ThreadPool и вообще не привязан к накачке сообщений, следовательно, это сработало.

Когда вы запускаете Application.Run(myForm) впроект WinForms, этот вызов также запускает насос сообщений, который управляет сообщениями пользовательского интерфейса.Таймер Windows, который вы упоминаете, является компонентом пользовательского интерфейса и ожидает, что насос сообщений будет запущен, чтобы вызвать событие галочки в потоке пользовательского интерфейса.

Посмотрите здесь, чтобы запустить насос сообщений в службе Windows:

Насос сообщений в .NET Windows service

Дополнительная информация:

http://support.microsoft.com/kb/842793

В заключение я бы хотелпросто идите с System.Threading.Timer классом.

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