最近在工作中遇到需要精准控制时间的情况,最开始当然是使用C#中微软提供的timer定时器实现,后来发现误差较大,本来需要耗时41秒,结果timer计时器统计为36,真的离谱。查阅资料后得知timer定时器的精度为15ms,但据我测试应该是要大于15ms的。
如果需要精准计时,推荐使用StopWatch
类来实现,为了比较timer
与StopWatch
的定时误差,我简单写了个demo,代码如下。
首先是使用StopWatch
实现的定时器类Mytimer
复制
public delegate void Tick(String s); public class Mytimer { private Stopwatch stopwatch; public int Interval = 10; public bool IsStart = false; public event Tick MyTick; private long lasttime = 0; public Mytimer() { stopwatch = new Stopwatch(); } public void Start() { IsStart = true; stopwatch.Start(); TickAsync(); } public void Stop() { IsStart = false; } private async void TickAsync() { await Task.Run(() => Do()); } private void Do() { while (IsStart) { if (stopwatch.ElapsedMilliseconds-lasttime>= Interval) { MyTick(stopwatch.ElapsedMilliseconds.ToString()); lasttime = stopwatch.ElapsedMilliseconds; } } stopwatch.Reset(); lasttime = 0; } }
此类提供了时钟触发周期属性,支持自定义触发间隔。
使用代码如下
复制
public Form1() { InitializeComponent(); } Tick upui; Mytimer mt; private void Form1_Load(object sender, EventArgs e) { upui = new Tick(ui); mt = new Mytimer(); mt.Interval = 1000; mt.MyTick += test; } long timer_time=0; private void timer1_Tick(object sender, EventArgs e) { timer_time = timer_time + 1000; label1.Text = timer_time.ToString(); } private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; timer1.Interval = 1000; timer1.Start(); mt.Start(); } private void button2_Click(object sender, EventArgs e) { timer1.Stop(); mt.Stop(); } void test(String s) { Invoke(upui, s); } void ui(String s) { label2.Text = s; }
首先看看在1ms分辨率下的误差效果
可以看到误差非常大,单位是毫秒。
15ms分辨率下的效果
100ms分辨率
1000ms分辨率
总结一下,如果需要精度在毫秒级的计时,推荐使用StopWatch。秒级别的都可以,timer使用起来还是很方便的。
评论 (0)