C#用Timer实现简易定时任务服务
自己业余的时候开发了一个小玩意,用到了定时任务的东西,当时考虑用quartz,但是quartz对于我目前的小玩意来说过于庞大,因此想到自己写一个基于Timer的定时任务服务
这里需要有两个最基本的点需要保证,第一个是定时的请求间隔需要稳定在1分钟,第二是需要跟随系统启动。
第一版开发,用了很简单的实现方式,发现执行的时候,毫秒会叠加。
执行结果:
百度之后,发现不少人都遇到了这种问题,但是没有找到有效的解决方案。
后来想根据线程睡眠的方式调整执行时间,大体思路是记下来第一次执行的时间,然后后续每次执行都和第一次执行时间做比较,然后计算差值,线程睡眠该差值。
实际操作的时候因为忘了了这个Timer的Elapsed的时间执行是异步执行的,和实际Timer的Interval 并没有影响,因此最后跑出来的结果也并不理想。
(PS:这个方案是可以的,只是每次计算感觉会很麻烦,而且需要每次执行事件的时候需要Stop Timer,执行完成再Start Timer )
最后想到了调整Interval的方式
大体思路是判断当前执行时间的毫秒数,如果毫秒数大于800,则将Interval赋值为59999,如果毫秒数小于200,则将Interval赋值为60000
运行结果发现,存在毫秒降低的情况,但是总体的运行结果是毫秒依然在不断增加
运行结果:
最终决定,将Interval的变更值从1毫秒调整为100毫秒,运行结果如下
从运行结果来看,基本上实现了一个执行时间自行修补的一个过程
至此,一个简易的定时任务算是完成了。
(BTW:这里也曾使用过Thread.Timer,然而发现,这种方式,在卸载windows服务的时候很麻烦,会出现卸载不掉的情况,需要在进程中杀死进程后才可以,因此弃用了Thread.Timer)
需要源代码的朋友可以去这里下载:点我点我点我