【问题标题】:c# timer not accurate ?c#计时器不准确?
【发布时间】:2017-04-10 17:44:41
【问题描述】:

我有一个函数应该在特定间隔后发送信号,精确到 1 毫秒 (ms)。 但似乎我的计时器需要的时间比他应该的要长一些,即我将一个 TimeSpan 传递给函数,时间为 20 毫秒,但计时器每次滴答需要 30 毫秒。我现在自己用Stopwatch 编写了一个计时器,但我仍然想知道为什么计时器需要更多时间来执行?

private System.Timers.Timer timer;

private void startResetTimer(TimeSpan time)
{
    timer = new System.Timers.Timer(time.TotalMilliseconds);
    timer.Elapsed += OnTimedEvent;
    timer.AutoReset = true;
    timer.Enabled = true;
}

private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
    if (!waitForTimerReset.Set())
        Console.WriteLine("Could not wake up any threads!");
}

在我的代码中,计时器唯一执行的是waitForTimerReset.Set() 方法,它允许线程在被ManualResetEvent 停止后继续,这意味着此调用不应花费 10 毫秒。

【问题讨论】:

标签: c# visual-studio-2013 timer


【解决方案1】:

没有。计时器根本不准确。这不是它的预期目的。 至少将花费您设置为间隔的时间。

“问题”是:运行计时器的线程在滴答声发生后被停止。然后处理器需要做一些其他的工作,并在该工作完成一段时间后返回并进行下一个滴答。这就是为什么这种计时器不准确的原因。

为了解决这个问题,您有时可以计算 start 和 now 之间的差异,并使用它而不是计算滴答声。

【讨论】:

  • 它需要至少您设置的时间间隔。这就是所有的保证。
  • 感谢您的快速回答。所以这意味着在我的例子中计时器至少等待 20 毫秒,但可以使用更多时间吗?我读到计时器每次滴答至少需要 15 毫秒,这就是为什么计时器需要 30 毫秒而不是 20 毫秒?
  • 是的,可以超过20ms。下限确实在 15 到 16 毫秒之间。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2017-03-29
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多