定时器滞后

本文关键字:滞后 定时器 | 更新日期: 2023-09-27 18:19:09

我想在我的应用程序中有一个运行计时器,它显示的秒数达到小数点后2位,例如2.31秒。我使用System.Threading.Timer,我将Timer对象设置为每10毫秒调用refreshTimeBox()函数(因为我希望秒数达到小数点后2位)。但是,计时器滞后了。随着时间的流逝,它越来越落后。我猜这是因为refreshTimeBox()花了太长时间来完成。但是,我也尝试每100毫秒调用refreshTimeBox()。定时器仍然滞后。唯一的区别是,在这种情况下,与我使用10毫秒作为间隔的情况相比,延迟在更长的时间后变得明显。我有以下代码来初始化计时器:

timer = new Timer(refreshTimeBox, null, 0, 10);

refreshTimeBox的代码如下:

public void refreshTimeBox(object param)
{
    time += 0.01f;
    Dispatcher.BeginInvoke(WriteTimeBox);
}

WriteTimeBox的代码如下:

public void WriteTimeBox()
{
    TimeBar.Text = time.ToString("0.00");
}

time是存储经过时间的变量,TimeBar是要更新的文本框。

我想要一个尽可能精确的计时器。请帮我一下。谢谢。

定时器滞后

如果你想显示从过去的一个特定事件以来所经过的时间,那么最好的方法是将时间存储在"时间0 ",例如startTime,然后,在你的计时器事件中,通过从当前时间减去startTime来计算所经过的时间,并显示差值。

你不能依赖计时器事件以精确的间隔交付。这不是一个实时系统。除此之外,您应该意识到BeginInvoke可能会请求方法调用发生在与当前线程不同的线程上,并且不同的线程可能无法在当前时间调度该方法调用。

你也可以使用秒表

        System.Diagnostics.Stopwatch sw=new System.Diagnostics.Stopwatch();
        sw.Start();

在update函数

        TimeBar.Text = sw.ElapsedMilliseconds;

那么你就不用担心UTC的问题

定时器总是有延迟的可能。你需要做的是存储你开始的时间,然后将其与当前时间进行比较。

private DateTime startTime;
public void startTimer() {
    startTime = DateTime.Now;
}
public void refreshTimeBox(object param)
{
    Dispatcher.BeginInvoke(WriteTimeBox);
}
public void WriteTimeBox()
{
    TimeSpan ts = DateTime.Now - startTime;
    // See http://msdn.microsoft.com/en-us/library/1ecy8h51.aspx for TimeSpan formatting.
    TimeBar.Text = ts.time.ToString("s.ff");
}