线程/定时器延迟的可能原因
本文关键字:定时器 延迟 线程 | 更新日期: 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.Restart()
。 - 在
updateTimeElapsed()
中使用Stopwatch.Elapsed
代替purelyTime
。
Stopwatch
字段。请注意,您的代码完全忽略了计时器处理程序函数本身所花费的时间。在处理程序中,您使用Invoke向UI发送消息并等待它返回。这可能会花费任意数量的时间,特别是在UI繁忙的情况下。