进行软件开发时,有没有这样的需求,每周都要发短信给客户;每天晚上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)。

 

构造函数
 名称 说明
[Scheduled Timer]第一回:Scheduled Timer介绍Timer() 初始化 Timer 类的新实例,并将所有属性设置为初始值。

AutoReset默认true

Enabled默认false

Interval默认100 毫秒

SynchronizingObject默认空引用

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

 

 

 

相关文章:

  • 2021-12-10
  • 2021-06-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-11
猜你喜欢
  • 2021-05-20
  • 2021-07-12
  • 2021-05-26
  • 2021-12-11
  • 2021-08-30
  • 2021-06-26
  • 2021-08-05
相关资源
相似解决方案