最近为了实现一个自动更新服务,决定用windows 服务,每隔一定时间,自动轮询服务上的组件是否有更新,如果有更新,则自动下载更新。这一部分没有什么难度,根据向导模板,创建一个windows service 项目,系统会自动生成一个Service1.cs的文件,双击打开该文件,然后再从“工具栏”-->“组件”下,拖一个Timer 控件到文件中,如图所示:
然后定义Timer的Interval属性和Tick 事件,编译、安装,正准备庆祝胜利的时候,结果不如所愿,问题出来了:Tick 事件不执行。检查来检查去,没什么问题啊,郁闷......
google,baidu 了一下,创建windows service 的文章铺天盖地,可是都是这样介绍的啊,没有特别说明的地方啊,为什么就不执行呢?最后在Service1.Designer.cs 文件中,发现了这样一个信息:
/// <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 中使用计时器时,必须手工修计时器定义,计时器才能正常运行。