让代码更简单

C#StopWatch毫秒级精准计时器实现

重要:本文最后更新于2023-03-11 13:17:57,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

最近在工作中遇到需要精准控制时间的情况,最开始当然是使用C#微软提供的timer定时器实现,后来发现误差较大,本来需要耗时41秒,结果timer计时器统计为36,真的离谱。查阅资料后得知timer定时器的精度为15ms,但据我测试应该是要大于15ms的。

如果需要精准计时,推荐使用StopWatch类来实现,为了比较timerStopWatch的定时误差,我简单写了个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分辨率下的误差效果

C#StopWatch毫秒级精准计时器实现

可以看到误差非常大,单位是毫秒。

15ms分辨率下的效果

C#StopWatch毫秒级精准计时器实现

100ms分辨率

C#StopWatch毫秒级精准计时器实现

1000ms分辨率

C#StopWatch毫秒级精准计时器实现

总结一下,如果需要精度在毫秒级的计时,推荐使用StopWatch。秒级别的都可以,timer使用起来还是很方便的。

感觉很棒!可以赞赏支持我哟~

1 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐