繁体   English   中英

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

[英]Why doesn't Windows Service work properly with System.Timers.Timer or System.Windows.Forms.Timer

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

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

经过一番挖掘后,我找到了这个网站: httpSystem.Threading.Timer ,博主建议使用另一个计时器: System.Threading.Timer 我第三次改变了这种方法, BOOM开始像魅力一样工作。

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

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线程上运行的回调,并且根本不依赖于消息泵,因此这有效。

当您在WinForms项目中运行Application.Run(myForm)时,该调用也会运行消息泵,这将管理UI消息。 您提到的Windows计时器是一个UI组件,并期望消息泵运行,以便在UI线程上发生tick事件。

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

.NET Windows服务中的消息泵

进一步阅读:

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

总之,我只使用System.Threading.Timer类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM