为什么Windows Service不能与System.Timers.Timer或System.Windows.Forms.Timer一起正常工作

Mic*_* B. 7 .net windows-services timer

我最近遇到了编写Windows服务的挑战.我需要定期请求URL并检查其可用性.为此,我决定OnStart在服务方法中初始化一个计时器,并在timer_Tick事件中完成所有工作.

我的第一个方法是使用System.Windows.Forms.Timer它的Tick事件.我选择了它,因为我正在阅读的教程.不知怎的,我无法使服务工作.它安装并启动没有问题,但它不会触发事件(我将调试器附加到进程并看到它没有被触发).我认为在Windows服务中使用Forms计时器可能不是一个好主意,所以我决定切换到System.Timers.Timer并利用它的Elapsed事件.这也不起作用.我在Windows窗体应用程序中尝试了两种提到的方法,但它们都有效.

经过一番挖掘,我找到了这个网站:http://weblogs.asp.net/sibrahim/archive/2004/01/13/58429.aspx,博客建议使用另一个计时器:System.Threading.Timer.我第三次改变了这种方法,BOOM开始像魅力一样工作.

我的问题是:为什么我不能在Windows服务中使用其他计时器,为什么找到有关它的信息这么困难?

Ada*_*rth 8

System.Windows.Forms.Timer定时器使用的UI消息泵编组Tick事件,服务不运行在默认情况下一个消息泵所以没有一点额外的工作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项目中运行时,该调用也会运行消息泵,这将管理UI消息.您提到的Windows计时器是一个UI组件,并期望消息泵运行,以便在UI线程上发生tick事件.

看看这里在Windows服务中运行消息泵:

.NET Windows服务中的消息泵

进一步阅读:

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

总之,我只是去System.Threading.Timer上课.

  • 这两个计时器都在线程池线程上运行代码.让事件/回调在创建计时器的同一个线程上运行需要魔术.消息泵提供的那种魔力. (2认同)