.net – 为什么Windows服务不能与System.Timers.Timer或System.W
我最近遇到了编写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服务中使用其他计时器,为什么找到有关它的信息这么困难?
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服务中运行消息泵: Message pump in .NET Windows service 进一步阅读: http://support.microsoft.com/kb/842793 总之,我只是使用System.Threading.Timer类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 构建适用于Windows的Python C扩展模块
- microsoft-graph – 在Microsoft Graph / me / drive / sea
- Windows系统故障排查
- windows-server-2003 – Server 2003缺少NETLOGON文件夹
- windows – 如何检测连接的USB打印机是打开还是关闭?
- windows – 在哪里使用null BSTR记录?
- 内存 – x64 Windows报告安装了64GB RAM的32GB RAM – 为什
- Microsoft Excel错误:“将命令发送到程序时出现问题.”
- windows-phone-7 – 是否可以为Windows Phone 7模拟器模拟第
- 用Win2003?server打造安全的个人Web服务器
- 无法使用Selenium和IEWebDriverServer 3.4.0在Wi
- ActiveX Edge在Microsoft Edge中有替代品吗?
- Windows限制每台机器同时打开的插槽/连接数
- CVE-2019-0708远程桌面代码执行漏洞复现
- 解决win10 蓝牙设备只能配对无法连接 ,并且删除
- windows – 我可以查询DHCP服务器以获取MAC到IP地
- 三、Windows下用FFmpeg+nginx+rtmp搭建直播环境
- 编译 – 在另一台Windows机器上运行Rust编译程序
- dynamic-crm – 您的Microsoft Dynamics CRM经验
- windows – 如何创建hotfolder解决方案