• C#里面的三种定时计时器:TIMER


    在.NET中有三种计时器:
    1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的Form属于同一个线程;
    2、System.Timers命名空间下的Timer类。System.Timers.Timer类:定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时(设置为false只执行一次,设置为true可以多次执行)。Elapsed事件绑定相当于另开了一个线程,也就是说在Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)。
    3、System.Threading.Timer类。定义该类时,通过构造函数进行初始化。
    在上面所述的三种计时器中,第一种计时器和它所在的Form处于同一个线程,因此执行的效率不高;而第二种和第三种计时器执行的方法都是新开一个线程,所以执行效率比第一种计时器要好,因此在选择计时器时,建议使用第二种和第三种。
    
    下面是三种定时器使用的例子:
    
    1、Timer控件
    
    设计界面:
    
    
    
    后台代码:
    
    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 namespace TimerDemo
    11 {
    12     public partial class FrmMain : Form
    13     {
    14         //定义全局变量
    15         public int currentCount = 0;
    16         public FrmMain()
    17         {
    18             InitializeComponent();
    19         }
    20 
    21         private void FrmMain_Load(object sender, EventArgs e)
    22         {
    23             //设置Timer控件可用
    24             this.timer.Enabled = true;
    25             //设置时间间隔(毫秒为单位)
    26             this.timer.Interval = 1000;
    27         }
    28 
    29         private void timer_Tick(object sender, EventArgs e)
    30         {
    31             currentCount += 1;
    32             this.txt_Count.Text = currentCount.ToString().Trim();
    33         }
    34 
    35         private void btn_Start_Click(object sender, EventArgs e)
    36         {
    37             //开始计时
    38             this.timer.Start();
    39         }
    40 
    41         private void btn_Stop_Click(object sender, EventArgs e)
    42         {
    43             //停止计时
    44             this.timer.Stop();
    45         }
    46     }
    47 }
    复制代码
    2、System.Timers.Timer
    
    设计界面:
    
    
    
    后台代码:
    
    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 namespace TimersTimer
    11 {
    12     public partial class FrmMain : Form
    13     {
    14         //定义全局变量
    15         public int currentCount = 0;
    16         //定义Timer类
    17         System.Timers.Timer timer;
    18         //定义委托
    19         public delegate void SetControlValue(string value);
    20 
    21         public FrmMain()
    22         {
    23             InitializeComponent();
    24         }
    25 
    26         private void Form1_Load(object sender, EventArgs e)
    27         {
    28             InitTimer();
    29         }
    30 
    31         /// <summary>
    32         /// 初始化Timer控件
    33         /// </summary>
    34         private void InitTimer()
    35         {
    36             //设置定时间隔(毫秒为单位)
    37             int interval = 1000;
    38             timer = new System.Timers.Timer(interval);
    39             //设置执行一次(false)还是一直执行(true)
    40             timer.AutoReset = true;
    41             //设置是否执行System.Timers.Timer.Elapsed事件
    42             timer.Enabled = true;
    43             //绑定Elapsed事件
    44             timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerUp);
    45         }
    46 
    47         /// <summary>
    48         /// Timer类执行定时到点事件
    49         /// </summary>
    50         /// <param name="sender"></param>
    51         /// <param name="e"></param>
    52         private void TimerUp(object sender, System.Timers.ElapsedEventArgs e)
    53         {
    54             try
    55             {
    56                 currentCount += 1;
    57                 this.Invoke(new SetControlValue(SetTextBoxText),currentCount.ToString());
    58             }
    59             catch (Exception ex)
    60             {
    61                 MessageBox.Show("执行定时到点事件失败:" + ex.Message);
    62             }
    63         }
    64 
    65         /// <summary>
    66         /// 设置文本框的值
    67         /// </summary>
    68         /// <param name="strValue"></param>
    69         private void SetTextBoxText(string strValue)
    70         {
    71             this.txt_Count.Text = this.currentCount.ToString().Trim();
    72         }
    73 
    74         private void btn_Start_Click(object sender, EventArgs e)
    75         {
    76             timer.Start();
    77         }
    78 
    79         private void btn_Stop_Click(object sender, EventArgs e)
    80         {
    81             timer.Stop();
    82         }
    83     }
    84 }
    复制代码
    3、System.Threading.Timer
    
    设计界面:
    
    
    
    后台代码:
    
    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 using System.Threading;
    10 
    11 namespace Threading.Timer
    12 {
    13     public partial class FrmMain : Form
    14     {
    15         //定义全局变量
    16         public int currentCount = 0;
    17         //定义Timer类
    18         System.Threading.Timer threadTimer;
    19         //定义委托
    20         public delegate void SetControlValue(object value);
    21 
    22         public FrmMain()
    23         {
    24             InitializeComponent();
    25         }
    26 
    27         private void FrmMain_Load(object sender, EventArgs e)
    28         {
    29             InitTimer();
    30         }
    31 
    32         /// <summary>
    33         /// 初始化Timer类
    34         /// </summary>
    35         private void InitTimer()
    36         {
    37             threadTimer = new System.Threading.Timer(new TimerCallback(TimerUp), null, Timeout.Infinite, 1000);
    38         }
    39 
    40         /// <summary>
    41         /// 定时到点执行的事件
    42         /// </summary>
    43         /// <param name="value"></param>
    44         private void TimerUp(object value)
    45         {
    46             currentCount += 1;
    47             this.Invoke(new SetControlValue(SetTextBoxValue), currentCount);
    48         }
    49 
    50         /// <summary>
    51         /// 给文本框赋值
    52         /// </summary>
    53         /// <param name="value"></param>
    54         private void SetTextBoxValue(object value)
    55         {
    56             this.txt_Count.Text = value.ToString();
    57         }
    58 
    59         /// <summary>
    60         /// 开始
    61         /// </summary>
    62         /// <param name="sender"></param>
    63         /// <param name="e"></param>
    64         private void btn_Start_Click(object sender, EventArgs e)
    65         {
    66             //立即开始计时,时间间隔1000毫秒
    67             threadTimer.Change(0, 1000);
    68         }
    69 
    70         /// <summary>
    71         /// 停止
    72         /// </summary>
    73         /// <param name="sender"></param>
    74         /// <param name="e"></param>
    75         private void btn_Stop_Click(object sender, EventArgs e)
    76         {
    77             //停止计时
    78             threadTimer.Change(Timeout.Infinite, 1000);
    79         }
    80     }
    81 }
    

      

  • 相关阅读:
    网站安全:你面临2个至关重要的挑战!
    一个只需要点 「下一步」就完成监控 Windows
    论MOBA类游戏五号位的重要性
    CloudTest 事务监控:千呼万唤始出来
    深入浅出 ES6:ES6 与 Babel / Broccoli 的联用
    精华阅读第7期|程序员职业人生规划的三点建议
    (12)打鸡儿教你Vue.js
    (11)打鸡儿教你Vue.js
    (10)打鸡儿教你Vue.js
    (9)打鸡儿教你Vue.js
  • 原文地址:https://www.cnblogs.com/profession/p/8968312.html
Copyright © 2020-2023  润新知