在VS2005 中使用的计时器(Timer)的困惑.

  最近为了实现一个自动更新服务,决定用windows 服务,每隔一定时间,自动轮询服务上的组件是否有更新,如果有更新,则自动下载更新。这一部分没有什么难度,根据向导模板,创建一个windows service 项目,系统会自动生成一个Service1.cs的文件,双击打开该文件,然后再从“工具栏”-->“组件”下,拖一个Timer 控件到文件中,如图所示:

  

      然后定义Timer的Interval属性和Tick 事件,编译、安装,正准备庆祝胜利的时候,结果不如所愿,问题出来了:Tick 事件不执行。检查来检查去,没什么问题啊,郁闷......

  google,baidu 了一下,创建windows service 的文章铺天盖地,可是都是这样介绍的啊,没有特别说明的地方啊,为什么就不执行呢?最后在Service1.Designer.cs 文件中,发现了这样一个信息:

       #region 

        
/// <summary> 
        
/// 
        
/// 
        
/// </summary>
        private void InitializeComponent()
        {
            
this.components = new System.ComponentModel.Container();
            
this.timer1 = new System.Windows.Forms.Timer(this.components);
            
// 
            
// Service1
            
// 
            this.ServiceName = "Service1";

        }

        
#endregion

        
private System.Windows.Forms.Timer timer1;

private System.Windows.Forms.Timer timer1;为什么是 System.Windows.Forms.Timer呢,在service 中,应该不能运行Windows.Forms啊,问题可能就出在这里了,Find Help ,原来还有一个Timer :System.Timers.Timer ,手工修改Service1.Designer.cs文件,把Tick事件 变为Elapsed事件,重新编译、安装,成功了,一个小小的东西,竟折腾了我一个多小时,个中滋味,真难以表达啊。

  总结:

  在Visual Studio 中提供了三种类型的Timer:

     System.Windows.Forms.Timer    基于windows 的计时器,运行于Windows 窗体程序中。

     System.Timers.Timer       基于服务的计时器,运行于服务器环境中。

     System.Threading.Timer     基于线程的计时器,使用回调方法而不是使用事件,并由线程池线程提供支持。

      在Visual Studio 2003的工具箱里面默认提供了System.Windows.Forms.Timer和System.Timers.Timer两种,而Visual Studio 2005 或者2008中却只默认提供了System.Windows.Forms.Timer这一种,所以在vs 2005或者VS2008的windows service 中使用计时器时,必须手工修计时器定义,计时器才能正常运行。

原文地址:https://www.cnblogs.com/invinboy/p/1255950.html