最近在工作中遇到需要精准控制时间的情况,最开始当然是使用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)