• 让服务不再停止(在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用于其他目的,对于其他一些有可能暂时中断,但以后会恢复的情况,都可以采用类似的方法处理。比如说网络中断之类的吧。
  • 相关阅读:
    Codeforces Round #501 (Div. 3)
    01分数规划
    矩阵快速幂模板
    求区间不同数的个数 树状数组||莫队算法
    vector
    线性dp
    别人整理的dp题目
    codeforces1073d Berland Fair 思维(暴力删除)
    codeforces 1072D Minimum path bfs+剪枝 好题
    codeforces 1068d Array Without Local Maximums dp
  • 原文地址:https://www.cnblogs.com/bingyun84/p/1735326.html
Copyright © 2020-2023  润新知