您的位置:首页 > 数据库

Windows Service开发日志一(Win服务的一些技巧与出错处理)

2008-12-24 14:12 141 查看
最近要帮公司系统增加一个类似于QQ机器人的功能,通过聊天人员发送相关指令(特殊字符),自动到数据库中取相关信息返回聊天人员,由于功能单一而且要长期执行,所以我想起用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服务项目时,系统会自动创建一个叫Service1的服务,如果我装其它文件重命名为AlarmService后,打开Program.cs发现里面创建的服务对象还是Service1,要手工进行修改,不然注册服务后运行就会报1083,还有一点,同一项目如果创建了两个或以上服务时,新创建的服务系统也不会为其创建对象,也是要手工在Program.cs文件中添加,否则启动服务时也会报1083错

语法如下:

ServiceBase[] ServicesToRun;

ServicesToRun = new ServiceBase[] 

   { 

    new AMIService(),new AlarmService()    //假设两个服务的名分别为AMIService和AlarmService

   };

ServiceBase.Run(ServicesToRun);

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息