zoukankan      html  css  js  c++  java
  • [Scheduled Timer]第一回:Scheduled Timer介绍

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

  • 相关阅读:
    Restful api 返回值重复的问题
    fastDFS遇到的并发问题recv cmd: 0 is not correct, expect cmd: 100
    忽略警告@SuppressWarnings的用法
    Mysql 一些命令记录
    python 操作excel实现替换特定内容
    python 提取目录中特定类型的文件
    python使用tkinter无法获取输入框的值
    python使用tkinter无法给顶层窗体的输入框设定默认值
    游戏基础知识第一弹
    python 3.7.4 安装 opencv
  • 原文地址:https://www.cnblogs.com/qqlin/p/2686549.html
Copyright © 2011-2022 走看看