10

我有一个标签,它应该显示我的计时器的秒数(或者换句话说,我有一个变量,每个计时器的间隔都加 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;
}
4

4 回答 4

11

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

MSDN:Timer.Interval 属性

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

于 2013-01-18T09:27:37.170 回答
5

Tick使用事件代替Elapsed事件。

timer.Elapsed += new EventHandler(TimerEventProcessor);

并更改 TimerEventProcessor 方法的签名;

private void TimerEventProcessor(object sender, ElapsedEventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
于 2013-01-18T09:22:21.587 回答
1

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

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

因此,您应该使用以下命令代替 _Counter:

 // when starting the timer:
 DateTime _started = DateTime.UtcNow;

 // in TimerEventProcessor:
 seconds = (DateTime.UtcNow-started).TotalSeconds;
 Label.Text = seconds.ToString();

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

于 2013-01-18T09:33:36.110 回答
0

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

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

于 2021-09-18T18:38:54.887 回答