三种定时器实测精度都不是太高。
在.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类。定义该类时,通过构造函数进行初始化。
1. System.Windows.Forms.Timer
Windows 窗体计时器组件是单线程的,且限制为55毫秒的准确度。 如果需要具有更高准确性的多线程计时器,请使用 Timer 命名空间中的类 System.Timers 。
微软网站说明
https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.timer?view=net-5.0
System.Threading.Timer 是一个简单的轻型计时器,它使用回调方法,并由线程池线程提供服务。 不建议与 Windows 窗体一起使用,因为它的回调不会在用户界面线程上发生。 System.Windows.Forms.Timer 是与 Windows 窗体一起使用的更好选择。 对于基于服务器的计时器功能,您可以考虑使用 System.Timers.Timer ,它会引发事件并具有其他功能。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace timerdemo
{
public partial class Form1 : Form
{
//1
private System.Windows.Forms.Timer timer1 = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//if(timer1 == null)
{
//创建定时器
timer1 = new System.Windows.Forms.Timer();
//设置定时器属性
timer1.Tick += new EventHandler(HandleTimer1);
}
}
private void buttonStart1_Click(object sender, EventArgs e)
{
timer1.Interval = 2000;
timer1.Start();
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " start 2s\r\n";
}
public void HandleTimer1(Object myObject, EventArgs myEventArgs)
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff\r\n");
}
private void buttonStop1_Click(object sender, EventArgs e)
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " stop\r\n";
timer1.Stop();
}
private void buttonClr_Click(object sender, EventArgs e)
{
textBoxTest.Text = "";
}
private void buttonStart1_2_Click(object sender, EventArgs e)
{
timer1.Interval = 50;
timer1.Start();
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " start 50ms\r\n";
}
}
}
2. System.Timers.Timer
private void Form1_Load(object sender, EventArgs e)
{
//System.Timers.Timer实例化
timer2 = new System.Timers.Timer();
timer2.Interval = 2000;
// Hook up the Elapsed event for the timer.
timer2.Elapsed += OnTimedEvent; //Elapsed事件绑定相当于另开了一个线程
// Have the timer fire repeated events (true is the default)
timer2.AutoReset = true;
// Start the timer
//timer2.Enabled = true;
}
private System.Timers.Timer timer2 = null;
private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
//Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n";
}));
}
private void buttonStart2_Click(object sender, EventArgs e)
{
timer2.Interval = 2000;
// Hook up the Elapsed event for the timer.
//timer2.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
//timer2.AutoReset = true;
// Start the timer
timer2.Enabled = true;
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "start 2s\r\n";
}));
}
private void buttonStop2_Click(object sender, EventArgs e)
{
timer2.Enabled = false;
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "stop\r\n";
}));
}
private void buttonStart2_50ms_Click(object sender, EventArgs e)
{
timer2.Interval = 50;
// Hook up the Elapsed event for the timer.
//timer2.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
//timer2.AutoReset = true;
// Start the timer
timer2.Enabled = true;
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "start 50ms\r\n";
}));
}
3.System.Threading.Timer
private void Form1_Load(object sender, EventArgs e)
{
//System.Windows.Forms.Timer实例化
//if(timer1 == null)
{
//创建定时器
timer1 = new System.Windows.Forms.Timer();
//设置定时器属性
timer1.Tick += new EventHandler(HandleTimer1);
}
//System.Timers.Timer实例化
timer2 = new System.Timers.Timer();
timer2.Interval = 2000;
// Hook up the Elapsed event for the timer.
timer2.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
timer2.AutoReset = false;
// Start the timer
//timer2.Enabled = true;
//System.Threading.timer
// timer3 = new System.Threading.Timer(Timer3CallBack, null, 5000, 1000); //窗体启动后隔5s后每隔1s执行Timer3CallBack
timer3 = new System.Threading.Timer(Timer3CallBack, null, Timeout.Infinite, 1000); //窗体启动后不执行
}
//定义Timer类
System.Threading.Timer timer3;
private void Timer3CallBack(Object stateInfo)
{
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n";
}));
}
private void buttonStart3_Click(object sender, EventArgs e)
{
timer3.Change(0, 2000);
}
private void buttonStart3_50ms_Click(object sender, EventArgs e)
{
timer3.Change(0, 50);
}
private void buttonStop3_Click(object sender, EventArgs e)
{
timer3.Change(Timeout.Infinite, 1000);
}
4. 全部代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace timerdemo
{
public partial class Form1 : Form
{
//1
private System.Windows.Forms.Timer timer1 = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//System.Windows.Forms.Timer实例化
//if(timer1 == null)
{
//创建定时器
timer1 = new System.Windows.Forms.Timer();
//设置定时器属性
timer1.Tick += new EventHandler(HandleTimer1);
}
//System.Timers.Timer实例化
timer2 = new System.Timers.Timer();
timer2.Interval = 2000;
// Hook up the Elapsed event for the timer.
timer2.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
timer2.AutoReset = false;
// Start the timer
//timer2.Enabled = true;
//System.Threading.timer
// timer3 = new System.Threading.Timer(Timer3CallBack, null, 5000, 1000); //窗体启动后隔5s后每隔1s执行Timer3CallBack
timer3 = new System.Threading.Timer(Timer3CallBack, null, Timeout.Infinite, 1000); //窗体启动后不执行
}
private void buttonStart1_Click(object sender, EventArgs e)
{
timer1.Interval = 2000;
timer1.Start();
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " start 2s\r\n";
}
public void HandleTimer1(Object myObject, EventArgs myEventArgs)
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff\r\n");
}
private void buttonStop1_Click(object sender, EventArgs e)
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " stop\r\n";
timer1.Stop();
}
private void buttonClr_Click(object sender, EventArgs e)
{
textBoxTest.Text = "";
}
private void buttonStart1_2_Click(object sender, EventArgs e)
{
timer1.Interval = 50;
timer1.Start();
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " start 50ms\r\n";
}
private System.Timers.Timer timer2 = null;
private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n";
}));
}
private void buttonStart2_Click(object sender, EventArgs e)
{
timer2.Interval = 2000;
// Hook up the Elapsed event for the timer.
//timer2.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
//timer2.AutoReset = true;
// Start the timer
timer2.Enabled = true;
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "start 2s\r\n";
}));
}
private void buttonStop2_Click(object sender, EventArgs e)
{
timer2.Enabled = false;
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "stop\r\n";
}));
}
private void buttonStart2_50ms_Click(object sender, EventArgs e)
{
timer2.Interval = 50;
// Hook up the Elapsed event for the timer.
//timer2.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
//timer2.AutoReset = true;
// Start the timer
timer2.Enabled = true;
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "start 50ms\r\n";
}));
}
//3
//定义Timer类
System.Threading.Timer timer3;
private void Timer3CallBack(Object stateInfo)
{
this.Invoke((EventHandler)(delegate
{
textBoxTest.Text += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n";
}));
}
private void buttonStart3_Click(object sender, EventArgs e)
{
timer3.Change(0, 2000);
}
private void buttonStart3_50ms_Click(object sender, EventArgs e)
{
timer3.Change(0, 50);
}
private void buttonStop3_Click(object sender, EventArgs e)
{
timer3.Change(Timeout.Infinite, 1000);
}
}
}