zoukankan      html  css  js  c++  java
  • 定时器

     

     

    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; }
  • 相关阅读:
    Javascript 面向对象编程
    __dirname与__filename
    解决动画播放完后恢复到初始状态的问题
    基于jQuery滚动加载页面内容效果的插件封装
    JQuery 方法
    CSS 尺寸介绍
    原生JS组件编写,构造函数封装步骤
    面试题原型链
    基础面试题——什么是盒子模型
    数组去重方法
  • 原文地址:https://www.cnblogs.com/ike_li/p/6148543.html
Copyright © 2011-2022 走看看