1.引言

进行软件开发时,有没有这样的需求,每周都要发短信给客户;每天晚上12:00准时生成报表;每天 8:00到10:00 之间进行http请求抓数据包;每隔2分钟调用接口API进行同步数据等等。这些需求有一个共同的点,就是在正确的时间去做一件正确的事,这就是Scheduled Timer要干的。Scheduled Timer 是一个定时器调度,是一个对.net的Timer包装块。

2.定时器介绍

之前看到我的上级写了个定时作业,利用Thread睡眠1秒钟来循环来计时,感觉挺麻烦的。Scheduled Timer是使用System.Timers.TimerScheduled Timer是一个朋友给我的,说是老外写的。自己用了,感觉还可以,决定介绍一下
Scheduled Timer包装了多个功能,
  • 定时执行任务
  • 周期执行任务
  • 周期定时执行
  • 任务恢复执行
  • 任务同步、异步执行
  • 多任务执行
  • 异常处理、事件存储、 事件过滤等等。
先看看Timer介绍,在 C#里有3 个Timer 类:
  • System.Windows.Forms.Timer
  • System.Threading.Timer
  • System.Timers.Timer
实践证明其中System.Timers.Timer 最为稳定并且容易进行封装,下面就对System.Timers.Timer进行了解下。

System.Timers.Timer类型几个重要的成员,具体查看MSDN(摘自MSDN)。

 

构造函数
 名称说明
公共方法Timer() 初始化 Timer 类的新实例,并将所有属性设置为初始值。

AutoReset默认true

Enabled默认false

Interval默认100 毫秒

SynchronizingObject默认空引用

公共方法Timer(Double) 初始化 Timer 类的新实例,并将 Interval 属性设置为指定的毫秒数。该值必须大于零并小于或等于 Int32.MaxValue
 
 
属性
 名称说明
公共属性AutoReset 获取或设置一个值,该值指示 Timer 是应在每次指定的间隔结束时引发 Elapsed 事件,还是仅在指定的间隔第一次结束后引发该事件。
受保护的属性CanRaiseEvents 获取一个指示组件是否可以引发事件的值。 (继承自 Component。)
公共属性Container 获取 IContainer,它包含 Component (继承自 Component。)
受保护的属性DesignMode 获取一个值,用以指示 Component 当前是否处于设计模式。 (继承自 Component。)
公共属性Enabled 获取或设置一个值,该值指示 Timer 是否应引发 Elapsed 事件。
受保护的属性Events 获取附加到此 Component 的事件处理程序的列表。 (继承自 Component。)
公共属性Interval 获取或设置引发 Elapsed 事件的间隔。 该值必须大于零并小于或等于 Int32.MaxValue 默认值为 100 毫秒。
公共属性Site 基础结构。获取或设置在设计模式中将 Timer 绑定到其容器的站点。 (重写 Component.Site。)
公共属性SynchronizingObject 获取或设置对象,该对象用于在间隔过后封送发出的事件处理程序调用。
 
 
方法
 名称说明
公共方法Close 释放由 Timer 占用的资源。
公共方法Dispose() 释放由 Component 使用的所有资源。 (继承自 Component。)
受保护的方法Dispose(Boolean) 基础结构。释放由当前 Timer 使用的所有资源。 (重写 Component.Dispose(Boolean)。)
公共方法Start 通过将 Enabled 设置为 true 开始引发 Elapsed 事件。
公共方法Stop 通过将 Enabled 设置为 false 停止引发 Elapsed 事件。
 
 
 名称说明
公共事件Disposed 当通过调用 Dispose 方法释放组件时发生。 (继承自 Component。)
公共事件Elapsed 达到间隔时发生。
 

示例 

    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分钟,以提高精确度。

 

 

 

posted on 2012-09-20 17:11  Qlin  阅读(3455)  评论(13编辑  收藏  举报