4

所以一个足够简单的问题真的。

System.Timers 的时间间隔究竟是如何工作的?

无论超时事件需要多长时间,它是否每秒触发 1 秒,或者它是否需要例程首先完成然后重新启动间隔?

所以要么:

  1. 1 秒....1 秒....1 秒等等
  2. 1 秒 + 处理时间....1 秒 + 处理时间....1 秒 + 处理时间等等

我问这个的原因是我知道我的“处理”时间不到 1 秒,但我想每隔一秒就触发一次(或尽可能接近)。

我一直在使用这样的 Thread.Sleep 方法:

Thread.Sleep(1000 - ((int)(DateTime.Now.Subtract(start).TotalMilliseconds) >= 1000 ? 0 : (int)(DateTime.Now.Subtract(start).TotalMilliseconds)));

在例程开始时注册开始时间的位置。这里的问题是 Thread.Sleep 只能在毫秒内工作。所以我的例程可以在 1000 毫秒或 1000.0234 毫秒以上重新启动,这可能是因为我的一个例程根据“TimeSpan”需要 0 毫秒,但显然它使用了滴答/纳秒 - 这意味着时间已经关闭并且没有每一秒都更长。如果我可以按滴答声或纳秒入睡,那将是爆炸性的。

如果数字 1 适用于 System.Timers 那么我想我已经排序了。如果不是,我需要某种方法将线程“休眠”到更高分辨率的时间,即滴答声/纳秒。

你可能会问我为什么要做一个内联的 IF 语句,有时处理可能会超过 1000 毫秒,所以我们需要确保我们不会创建一个负数。此外,当我们确定这一点时,结束时间已经发生了轻微的变化——变化不大,但是,它可能会使线程延迟稍长一些,从而导致整个后续休眠。

我知道,我知道,时间可以忽略不计......但是如果系统突然停止几毫秒会发生什么......在这种情况下它可以防止这种情况。

更新 1

行。所以我没有意识到你可以把 TimeSpan 作为计时值。所以我使用了下面的代码:

Thread.Sleep(TimeSpan.FromMilliseconds(1000) - ((DateTime.Now.Subtract(start).TotalMilliseconds >= 1000) ? TimeSpan.FromMilliseconds(0) : DateTime.Now.Subtract(start)));

如果我是对的,那么这应该允许我在 1 秒内重复线程 - 或者系统允许的尽可能近的时间。

4

1 回答 1

2

如果您已经设置AutoReset = true;,那么您的理论 1 是正确的,否则您将不得不在代码中处理它 - 请参阅MSDN 上的文档Timer

于 2011-08-28T00:45:30.840 回答