1.引言
进行软件开发时,有没有这样的需求,每周都要发短信给客户;每天晚上12:00准时生成报表;每天 8:00到10:00 之间进行http请求抓数据包;每隔2分钟调用接口API进行同步数据等等。这些需求有一个共同的点,就是在正确的时间去做一件正确的事,这就是Scheduled Timer要干的。Scheduled Timer 是一个定时器调度,是一个对.net的Timer包装块。
2.定时器介绍
之前看到我的上级写了个定时作业,利用Thread睡眠1秒钟来循环来计时,感觉挺麻烦的。Scheduled Timer则是使用System.Timers.Timer。Scheduled Timer是一个朋友给我的,说是老外写的。自己用了,感觉还可以,决定介绍一下。
Scheduled Timer包装了多个功能,
- 定时执行任务
- 周期执行任务
- 周期定时执行
- 任务恢复执行
- 任务同步、异步执行
- 多任务执行
- 异常处理、事件存储、 事件过滤等等。
先看看Timer介绍,在 C#里有3 个Timer 类:
- System.Windows.Forms.Timer
- System.Threading.Timer
- System.Timers.Timer
System.Timers.Timer类型几个重要的成员,具体查看MSDN(摘自MSDN)。
构造函数
名称 | 说明 | |||
---|---|---|---|---|
![]() | 初始化 Timer 类的新实例,并将所有属性设置为初始值。
| |||
![]() | 初始化 Timer 类的新实例,并将 Interval 属性设置为指定的毫秒数。该值必须大于零并小于或等于 Int32.MaxValue。 |
属性
名称 | 说明 | |
---|---|---|
![]() | 获取或设置一个值,该值指示 Timer 是应在每次指定的间隔结束时引发 Elapsed 事件,还是仅在指定的间隔第一次结束后引发该事件。 | |
![]() | 获取一个指示组件是否可以引发事件的值。 (继承自 Component。) | |
![]() | 获取 IContainer,它包含 Component。 (继承自 Component。) | |
![]() | 获取一个值,用以指示 Component 当前是否处于设计模式。 (继承自 Component。) | |
![]() | 获取或设置一个值,该值指示 Timer 是否应引发 Elapsed 事件。 | |
![]() | 获取附加到此 Component 的事件处理程序的列表。 (继承自 Component。) | |
![]() | 获取或设置引发 Elapsed 事件的间隔。 该值必须大于零并小于或等于 Int32.MaxValue。 默认值为 100 毫秒。 | |
![]() | 基础结构。获取或设置在设计模式中将 Timer 绑定到其容器的站点。 (重写 Component.Site。) | |
![]() | 获取或设置对象,该对象用于在间隔过后封送发出的事件处理程序调用。 |
方法
名称 | 说明 | |
---|---|---|
![]() | 释放由 Timer 占用的资源。 | |
![]() | 释放由 Component 使用的所有资源。 (继承自 Component。) | |
![]() | 基础结构。释放由当前 Timer 使用的所有资源。 (重写 Component.Dispose(Boolean)。) | |
![]() | 通过将 Enabled 设置为 true 开始引发 Elapsed 事件。 | |
![]() | 通过将 Enabled 设置为 false 停止引发 Elapsed 事件。 |
事
件
名称 | 说明 | |
---|---|---|
![]() | 当通过调用 Dispose 方法释放组件时发生。 (继承自 Component。) | |
![]() | 达到间隔时发生。 |
示例
public class Timer1 { private static System.Timers.Timer aTimer; public static void Main() { aTimer = new System.Timers.Timer(10000) { Interval = 2000, Enabled = true, }; aTimer.Elapsed += (s, e) => { Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); }; Console.WriteLine("Press the Enter key to exit the program."); Console.ReadLine(); // If the timer is declared in a long-running method, use // KeepAlive to prevent garbage collection from occurring // before the method ends. //GC.KeepAlive(aTimer); } }
3.总结
3个Timer其中System.Timers.Timer 最为稳定(听说),易封装,而且的线程的申请,是通过线程池来调度的,Timer的Interval越长,越不稳定,设置20分钟,可能20分钟,可能是2个小时,甚至可能不会执行,所以不要设置太长,为了提高精确度,尽量设置在10分钟以下。Scheduled Timer里可以按分钟、小时、天、周、月进行周期执行任务,所以设置Interval最长为1分钟,以提高精确度。