首页 > 技术文章 > 定时器

ike_li 2016-12-09 10:43 原文

 

 

 

System.Timers.Timer是在.NET的Thread Pool上面运行的,而不是直接在UI Thread上面运行,所以在这种Timer的EventHandler里面进行耗时较长的计算不会导致UI失去响应。

调用 timer.Start()或者timer.Enabled = true来启动它, timer.Start()的内部原理还是设置timer.Enabled = true;

调用 timer.Stop()或者timer.Enabled = false来停止引发Elapsed事件, timer.Stop()的内部原理还是设置timer.Enabled = false,最重要的是timer.Enabled = false后会取消线程池中当前等待队列中剩余任务的执行。

当 AutoReset设置为false时,Timer只在第一个Interval过后引发一次Elapsed事件。若要保持以Interval时间间隔引发 Elapsed 事件,请将AutoReset设置为true。   


Elapsed事件在ThreadPool线程上引发。如果Elapsed事件的处理时间比Interval长,在另一个hreadPool线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。

 

避免还没执行完,间隔时间到,开始执行下一次。

 ((System.Timers.Timer)sender).Enabled = false;

   Console.WriteLine("TestTimer_Elapsed");

  ((System.Timers.Timer)sender).Enabled = true;

 

开启后等待间隔时间到,才执行,不是立即执行。

 

  System.Timers.Timer testTimer = new System.Timers.Timer();
        private void Form1_Load(object sender, EventArgs e)
        {
            testTimer.Interval = 5000;
            testTimer.Enabled = false;
            testTimer.Elapsed += new System.Timers.ElapsedEventHandler(TestTimer_Elapsed);
            testTimer.AutoReset = true;//设置为自动调用   

        }
        private void TestTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            ((System.Timers.Timer)sender).Enabled = false;

            Console.WriteLine("TestTimer_Elapsed");

            ((System.Timers.Timer)sender).Enabled = true;
        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            Console.WriteLine("btnStart_Click");
            testTimer.Enabled = true;
            
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            Console.WriteLine("btnStop_Click");
            testTimer.Enabled = false;
        }

 

看门狗:用来监测某一个方法是否在运行。

 

 System.Timers.Timer WatchDogTimer = new System.Timers.Timer();

        private void Form1_Load(object sender, EventArgs e)
        {
            WatchDogTimer.Interval = 3000;
            WatchDogTimer.Elapsed += new System.Timers.ElapsedEventHandler(WatchDogTimer_Elapsed);
            WatchDogTimer.Enabled = true;
            runDateTime= DateTime.Now;
        }

        private void WatchDogTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            TimeSpan ts = DateTime.Now - runDateTime;
            if((ts.Minutes * 60 + ts.Seconds)>= 3)
            {
                ShowLog("msg");
            }
         
        } DateTime runDateTime; private void button1_Click(object sender, EventArgs e) { //喂狗 runDateTime = DateTime.Now; }

 

推荐阅读