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

来源:互联网 发布:deb文件安装到linux 编辑:程序博客网 时间:2024/06/03 17:20

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

实际上呢,我们会建立一个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用于其他目的,对于其他一些有可能暂时中断,但以后会恢复的情况,都可以采用类似的方法处理。比如说网络中断之类的吧。
0 0
原创粉丝点击