线程/定时器延迟的可能原因

本文关键字:定时器 延迟 线程 | 更新日期: 2023-09-27 18:01:46

关于我之前的问题([问题]:计时器方法将在哪个线程中运行?)我在我的Windows窗体应用程序中添加了一个计时器,每100毫秒运行一次,以显示程序会话运行了多长时间。我将其定义如下(这些只是与计时器相关的代码片段):

private System.Timers.Timer timerPureTime = new System.Timers.Timer(100);

timerPureTime.Elapsed += new System.Timers.ElapsedEventHandler(updateTimeElapsed);
this.timerPureTime.SynchronizingObject = currentForm; //where currentForm is my main Form
public void updateTimeElapsed(object sender, ElapsedEventArgs e)
    {
        if (currentForm.lblTimeElapsed.InvokeRequired) //lblTimeElapsed is your standard Windows Form label
        {
            currentForm.lblTimeElapsed.Invoke((MethodInvoker)delegate  //also, trying to make make GUI invoking thread-safe here
            {
                TimeSpan t = TimeSpan.FromSeconds(purelyTime);
                string showTime = string.Format("{0:D2} min {1:D2} sec",
                    t.Minutes,
                    t.Seconds);
                currentForm.lblTimeElapsed.Text = showTime;
            });
        }
        else
        {
            TimeSpan t = TimeSpan.FromSeconds(purelyTime);
            string showTime = string.Format("{0:D2} min {1:D2} sec",
                t.Minutes,
                t.Seconds);
            currentForm.lblTimeElapsed.Text = showTime;
        }
        purelyTime += 0.1;
    }

据我所知,计时器应该在自己的线程中运行(从线程池中取出),但是它仍然会时不时地经历一些延迟,使计时器偏离航向。应用程序中的其他线程运行得非常有规律(每250ms一次)并且计算密集,但是这些线程不应该独立于Timer线程吗?

在这种情况下,可能导致计时器延迟的原因是什么?

线程/定时器延迟的可能原因

Windows不能保证计时器的精确规则回调,所以您肯定会看到这种差异。

你需要采取不同的方法:

    在你的类中初始化一个Stopwatch字段。
  1. 当您需要重置定时时,呼叫Stopwatch.Restart()
  2. updateTimeElapsed()中使用Stopwatch.Elapsed代替purelyTime

请注意,您的代码完全忽略了计时器处理程序函数本身所花费的时间。在处理程序中,您使用Invoke向UI发送消息并等待它返回。这可能会花费任意数量的时间,特别是在UI繁忙的情况下。