【问题标题】:Timer Interval 1000 != 1 second?计时器间隔 1000 != 1 秒?
【发布时间】:2013-01-01 23:21:18
【问题描述】:

我有一个标签,它应该显示我的计时器的秒数(或者换句话说,我有一个变量,每个计时器的间隔都加 1)。我的计时器的间隔设置为 1000,因此标签应该每秒更新一次(并且还应该显示秒数)。但是标签在 1 秒后已经有数百个。获得 1 秒的适当间隔是多少?

int _counter = 0;
Timer timer;

timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(TimerEventProcessor);
label1.Text = _counter.ToString();
timer.Start();

private void TimerEventProcessor(object sender, EventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}

【问题讨论】:

  • 你能发布你的代码吗? “标签已经有数百个”是什么意思?
  • @Default 现在 - 无处
  • 您是否在运行多次创建计时器的代码?
  • 多么讽刺,你的代码中的间隔是关闭的,但在你的帖子中是正确的
  • 由于您没有提供正确的代码并且您自己解决了问题,我的建议是用您的解决方案回答您自己的问题或关闭它。我说关闭它,因为就目前而言,它几乎不会帮助任何未来的访问者,除了他们应该检查错别字。

标签: c# timer seconds


【解决方案1】:

获得一秒的正确间隔是 1000。Interval 属性是滴答之间的时间,以毫秒为单位:

MSDN: Timer.Interval Property

所以,错误的不是您设置的时间间隔。检查其余代码,例如更改计时器的间隔,或多次绑定Tick 事件。

【讨论】:

    【解决方案2】:

    使用Elapsed 事件代替Tick 事件。

    timer.Elapsed += new EventHandler(TimerEventProcessor);
    

    并更改 TimerEventProcessor 方法的签名;

    private void TimerEventProcessor(object sender, ElapsedEventArgs e)
    {
      label1.Text = _counter.ToString();
      _counter += 1;
    }
    

    【讨论】:

    • timer.Elapsed += TimerEventProcessor; 就足够了。
    • 如果他使用 System.Windows.Forms.Timer ,则没有 Elapsed 事件。
    • 这是一个不同的Timer 类。没有Timer 类同时具有TickElapsed 事件。
    • 不知何故我无法使用经过的事件
    • System.Timers.Timer.Elapsed 事件,但不是..Forms..
    【解决方案3】:

    您在其他任何地方使用 TimerEventProcessor 或 Counter?

    无论如何,您不能依赖每秒准确传递一个事件。时间可能会有所不同,系统将无法确保平均时间是正确的。

    所以你应该使用 _Counter 而不是:

     // when starting the timer:
     DateTime _started = DateTime.UtcNow;
    
     // in TimerEventProcessor:
     seconds = (DateTime.UtcNow-started).TotalSeconds;
     Label.Text = seconds.ToString();
    

    注意:这并不能解决 TimerEventProcessor 被频繁调用,或者 _Counter 被频繁递增的问题。它只是掩盖它,但它也是正确的做法。

    【讨论】:

    • 至少使用UtcNow 而不是Now,但即便如此,当时钟发生变化时也会出现问题。
    【解决方案4】:

    已经是一个旧线程,但我刚刚阅读了 Microsoft 的文章,他们提到 System.Timer 取决于操作系统。也就是说,如果你使用 Windows 7 并且间隔小于 15 毫秒,间隔会被延迟。

    您使用 Interval 属性来确定触发 Elapsed 事件的频率。因为 Timer 类依赖于系统时钟,所以它具有与系统时钟相同的分辨率。这意味着如果 Interval 属性小于系统时钟的分辨率,则 Elapsed 事件将以系统时钟的分辨率定义的时间间隔触发。下面的示例将 Interval 属性设置为 5 毫秒。在系统时钟分辨率约为 15 毫秒的 Windows 7 系统上运行时,事件大约每 15 毫秒触发一次,而不是每 5 毫秒触发一次。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多