让服务不再停止(在Windows Service中使用Timer的技巧)
来源:互联网 发布:信捷plc编程手册 编辑:程序博客网 时间:2024/06/05 19:46
平时在开发中,经常遇到的一个需求就是,要开发一个后台的程序,来监视数据库中某些数据的变化,并且发生变化以后要立刻做出响应。
实际上呢,我们会建立一个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了。
{
timer1.Enabled = false;
try
{
// 在这里对数据库进行操作
timer1.Interval = 1 * 1000;
}
catch (SqlException sqlException)
{
timer1.Interval = 5 * 60 * 1000;
}
finally
{
timer1.Enabled = true;
}
}
需要注意的是,抛出异常也是需要时间的,所以这个示例虽然设置了5分钟,但是实际上轮循的时间会略大于5分钟。
上面只是对数据库的异常进行了处理,其实可以触类旁通的,如果Windows Service用于其他目的,对于其他一些有可能暂时中断,但以后会恢复的情况,都可以采用类似的方法处理。比如说网络中断之类的吧。
http://www.cnblogs.com/cuimingda/archive/2007/07/19/823653.html
- 让服务不再停止(在Windows Service中使用Timer的技巧)
- 让服务不再停止(在Windows Service中使用Timer的技巧)
- 让服务不再停止(在Windows Service中使用Timer的技巧)
- 在windows service中使用timer
- 在windows服务里如何使用timer
- 在windows服务里如何使用timer
- java中让线程停止的技巧
- 服务(Service)的停止和启动
- windows服务中的定时器timer的使用
- Windows系统下Tomcat在Service.msc中使用批处理启动和停止
- 使用Service的stopSelf()方法来停止服务
- Windows服务中Timer组件
- Windows服务中Timer组件
- android 在函数中使用return,让后面的代码不再执行
- Windows 服务中使用 Timer 控件时,Tick 事件不命中问题的解决
- 在VS2005中调试Windows Service Windows服务
- C#windows服务中的Timer控件的使用
- windows服务中的定时器timer的使用 写日志
- Java 语言实现的八大排序算法
- 一些初级错误
- ERP项目实施记录03
- 黑马程序员_IO输入与输出之RandomAccessFile类
- python实现哈弗曼树进行数据压缩
- 让服务不再停止(在Windows Service中使用Timer的技巧)
- 在linux中shell输入./vmware-install.pl什么意思
- 自己的一个shell脚本,包含了一些基础的用法
- 莫言母亲的八大教育真经
- C语言中执行sudo命令时自动导入密码
- ubuntu实用工具系列文章
- 淘宝省钱攻略–人人可以做到
- hdu1210Eddy's 洗牌问题(数学规律)
- win32 自动更新的一种方案