C#Thread.Sleep立即醒来

时间:2009-04-29 16:13:06

标签: c# multithreading

我正在使用以下代码

Thread.Sleep(5);

在while循环结束时。尝试在迭代之间获得5ms的延迟。

有时睡眠时间为16毫秒。我理解并接受这一点,因为它取决于CPU何时开始服务线程。然而,一旦它唤醒了下一次迭代,它似乎在睡眠调用后立即唤醒(我正在使用时间戳记录)。使用如此短的睡眠间隔是否存在问题,将其视为零?

4 个答案:

答案 0 :(得分:21)

你的问题就像在大多数现代机器上一样,DateTime.UtcNow的分辨率大约为10-15ms(虽然我看到文档说明自NT 3.5起大约10ms)。如果您想要更高分辨率的时序,请参阅Stopwatch课程,特别是Stopwatch.GetTimestamp()

另请注意,秒表只会使用高分辨率计时器(Stopwatch.IsHighResolution会在运行时告诉您)。如果没有,它将回退到DateTime.UtcNow.Ticks。

答案 1 :(得分:4)

最有可能的问题是,您的计时器分辨率有限。如果它只是每10ms更新一次,那么即使已经过了5ms,你也会在某些迭代中看到相同的时间戳。

您使用哪个计时器来生成时间戳?

答案 2 :(得分:1)

如果我没记错,NT时间切片是在NT内核中引入的,并且仍然以与XP相同的方式处于活动状态,它可以在5ms左右运行。我们正在构建一个实时应用程序并遇到了这个问题。您将无法始终获得5毫秒的睡眠时间。我们发现你有时会得到10 - 16毫秒,有时没有毫秒,偶尔却很少得到5毫秒。

我在大约5年前做过这些测试,但事情可能已经改变了。

答案 3 :(得分:0)

您在运行此类型的系统?小间隔可能取决于处理器以及它支持的分辨率。我在手持设备上运行了一个应用程序,计时器本身的分辨率为16毫秒。所以它可能与硬件有关。尝试将时间段增加到30毫秒,看看它是否有效。