• FCL中三个定时器的区别


    FCL中提供了三个定时器,而对于大多数程序员来说,他们不太清楚这三个定时器之间的区别。

             下面我们对这三个定时器进行分析:

             System.Threading的Timer类,这个定时器使我们最常用的定时器,当我们希望在另一个线程上定时执行后台任务时,这个定时器是最好的选择。

             System.Windows.Forms的Timer类  构建一个该类的实例可以告诉Windows将定时器与调用线程关联。随着定时器的触发,Windows将一个定时器消息(WM_TIMER)插入到线程的消息队列中。调用线程必须执行一个消息泵(message pump),从而提取消息,并将他们分派到期望的回调方法中。注意,所有这些工作都是由一个线程完成的----设置定时器的线程保证是执行回调方法的线程。这同样意味着我们的定时器方法不能被多个线程同时执行。

             System.Timers的Timer类 该定时器基本上是对System.Threading的Timer类的包装,当定时器时间到期后,将导致CLR将事件加入线程池的队列中。Component类允许将这些定时器对象放置在Microsoft Visual Studio设计界面上。另外,System.Timers.Timer类的成员也有点不同。这个类在数年前就被添加到FCL中了,而那时Microsoft仍然在对线程处理和定时器材质进行分类。这个类或许被移除,以便于每个人都可以使用System.Threading的Timer类。实际上,我们从来不使用System.Timer.Timer类,而且我还劝大家不要使用这个类,除非大家这的希望在设计界面上使用定时器。

     

             下面是一个System.Threading的Timer类例子,这个类是我们经常使用的:

    using System;
    using System.Threading;
    
    namespace TestTimer
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("主线程:正在启动Timer");
                //ComputeBoundOp是被执行的函数
                Timer t = new Timer(ComputeBoundOp, 5, 0, 2000);
    
                Console.WriteLine("主线程: 正在工作。。。");
                Thread.Sleep(10000);  //模拟工作(10秒钟)
                t.Dispose();  //取消定时器
            }
    
            /// <summary>
            /// 该方法的签名必须与TimerCallback委托类型匹配
            /// </summary>
            /// <param name="state"></param>
            private static void ComputeBoundOp(Object state)
            { 
                //该方法由线程池中的线程执行
                Console.WriteLine("在ComputeBoundOp中: state={0}", state);
                Thread.Sleep(1000);  //模拟其他工作(1秒钟)
    
                //在这个方法返回后,线程就回到线程池中,然后等待执行另一个任务
            }
        }
    }

     

      当Timer对象被执行垃圾收集时,CLR就会取消定时器,以便定时器不再继续触发,因此,使用Timer对象时,一定要确保一个变量来引用Timer对象,从而保持Timer对象继续存活,否则回调方法就不会再被调用。

      Timer t = new Timer(ComputeBoundOp, 5, 0, 2000);这段代码中,ComputeBoundOp是线程回调的方法,5是构造器的state参数,它允许我们将状态数据传递给回调方法,如果没有状态数据可传递,可以传递null。0是dueTime参数,dueTime参数可以告诉CLR在第一次调用回调方法时需要等待多少毫秒。在这里设置为0,表示希望回调方法立即被调用。2000是period参数,它表示回调方法执行的间隔时间,这里我们设置的是2000毫秒.

       更多原创内容,可以到我的小站(www.shuonar.com)进行阅读,欢迎拍砖。

  • 相关阅读:
    (12)springboot打war包-copy
    基于Python在MacOS上安装robotframework-ride
    mac终端输入python默认打开python3
    win10 切换网卡的bat
    PyCharm2018激活码
    我告诉你 ,一个 window免费系统下载的网站!
    oracle 子查询的几个种类
    trunc()
    case when then else end 与 decode 的区别
    触发器 of oracle
  • 原文地址:https://www.cnblogs.com/shuonar/p/3114759.html
Copyright © 2020-2023  润新知