最近要帮朋友做一个即时发送邮件的系统,由于功能单一而且要长期执行,所以我想起用Windows服务的方式处理,同时也可以学习一下相关知识.在开发中遇到的问题和处理方法,我都记录在其中,希望能帮助有相同困难要处理的朋友.
一.Windows服务中的时钟问题.
要在服务中实现定时询问,一般有两种做法,其一是用时钟定时执行,其二是用线程,如果用时钟来处理的话就要注意了,从工具箱中取出的控件默认都是继承于类System.Windows.Forms.Timer,但这种控件在服务中是不会被执行的,如果要在服务中用,一定要用继承于类System.Timers.Timer的控件才行,
如果你想保持用可视化的方式来开发,你可以打开服务对应的设计文件(举例,服务文件名叫AlarmService,那么就打开AlarmService.Desinger.cs),将里面的System.Windows.Forms.Timer改为System.Timers.Timer(注意,有两个地方要改),保存后,你双击服务中的Timer控件就会发现创建的事件已经不同了,但其它地方大致还是一样的.
你也可以用代码同态创建,然后定义一个方法,再将方法绑到对象的Elapsed事件中,代码如下
Timer Timer1=new Timer()
protected override void OnStart(string[] args)
{
Timer1.Elapsed +=this.timer1_Elapsed; //动态绑定事件
}
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//中间省略
}
即可
二.创建好服务好启动服务时出错,提示#1083
由于我同一个项目中创建了两个服务,但C#很笨,我装服务改名时,他不会为新的服务重新创建一个新的对象,举例:我创建一个Windows服务项目时,系统会自动创建一个叫SendTWMail的服务,如果我装其它文件重命名为SendXMMail后,打开Program.cs发现里面创建的服务对象还是Service1,要手工进行修改,不然注册服务后运行就会报1083,还有一点,同一项目如果创建了两个或以上服务时,新创建的服务系统也不会为其创建对象,也是要手工在Program.cs文件中添加,否则启动服务时也会报1083错
语法如下:
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new SendTWMail(),new SendXMMail() //假设两个服务的名分别为SendTWMail和SendXMMail
};
ServiceBase.Run(ServicesToRun);