asdfasfasdf

让服务不再停止(在Windows Service中使用Timer的技巧)

平时在开发中,经常遇到的一个需求就是,要开发一个后台的程序,来监视数据库中某些数据的变化,并且发生变化以后要立刻做出响应。

实际上呢,我们会建立一个Windows Service工程,在里面放一个Timer组件,然后定时的连接数据库,判断,然后进行操作。

这两天做了一个这样的小程序,可是每隔几天就会发现服务不知道在什么时候,莫名其妙的停掉了,查找程序,没有发现什么错误。于是找日志,发现那个时间数据库服务器更新了程序,自动重新启动了。因为我的Windows Service每隔1秒钟连接一次数据库,所以肯定会碰到SqlException异常,自然就Down掉了。

确定了问题的原因,解决的思路也就清晰了。数据库正常的情况下,每隔1秒钟连接一次数据库,一旦发现数据库连接不上,则变为5分钟甚至更长的时间连接一次数据库,直到数据库可以正常使用,再修改间隔为1秒钟。最主要的,无论数据库发生什么情况,Timer组件的事件应该是不能中断的。

具体实现呢,有这么几点需要注意的吧:
1、从工具箱拖到窗口的Timer,实际上是System.Windows.Forms.Timer,这家伙在Windows Service下是不触发事件的,需要到扩展名为designer.cs的文件中,修改为System.Timers.Timer。
2、在控件的属性中或者直接在服务的OnStart事件中,设置Timer的Enable为True,Interval为需要轮循数据库的值,这个单位是毫秒。
3、接下来就是Timer的事件了,参照下面这段代码就OK了。

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    timer1.Enabled 
= false;

    
try
    {
        
// 在这里对数据库进行操作

        timer1.Interval 
= 1 * 1000;
    }
    
catch (SqlException sqlException)
    {
        timer1.Interval 
= 5 * 60 * 1000;
    }
    
finally
    {
        timer1.Enabled 
= true;
    }
}

需要注意的是,抛出异常也是需要时间的,所以这个示例虽然设置了5分钟,但是实际上轮循的时间会略大于5分钟。

上面只是对数据库的异常进行了处理,其实可以触类旁通的,如果Windows Service用于其他目的,对于其他一些有可能暂时中断,但以后会恢复的情况,都可以采用类似的方法处理。比如说网络中断之类的吧。

posted on 2007-07-19 11:46  明达  阅读(7639)  评论(2编辑  收藏  举报

导航