我正在使用下面的代码
Thread.Sleep(5);在while循环的末尾。尝试在迭代之间获得5ms的延迟。
有时它会休眠16毫秒。我理解并接受这一点,因为这取决于CPU何时开始为线程提供服务。然而,一旦它在下一次迭代中被唤醒,它似乎会在睡眠调用之后立即被唤醒(我正在使用时间戳进行记录)。使用如此短的睡眠间隔而将其视为零有问题吗?
发布于 2009-04-29 16:15:31
你的问题就像在大多数现代机器上一样,DateTime.UtcNow的分辨率大约是10-15ms (尽管我看到文档说它是从NT3.5开始的大约10ms )。如果您想要更高分辨率的计时,请参阅Stopwatch类,特别是Stopwatch.GetTimestamp()。
还要注意,秒表将只使用高精度计时器(如果它们可用) (Stopwatch.IsHighResolution将在运行时告诉您)。如果不是,它将回退到DateTime.UtcNow.Ticks。
发布于 2009-04-29 16:15:12
最有可能的是,问题只是你的计时器的分辨率有限。如果它只更新一次,比如每10ms更新一次,那么即使5ms已经过去了,你也会在一些迭代中看到相同的时间戳。
你用哪个计时器来生成你的时间戳?
发布于 2009-04-29 16:27:47
如果我没记错的话,NT时间切片是在NT内核中引入的,它仍然以与XP相同的方式活跃,它的运行时间正好在5ms左右。我们在构建一个实时应用程序时遇到了这个问题。你将无法持续获得5毫秒的睡眠时间。我们发现,你有时会得到10 - 16毫秒,有时没有毫秒,偶尔也很少会得到5毫秒。
我在大约5年前做了这些测试,所以事情可能从那时起就发生了变化。
https://stackoverflow.com/questions/803127
复制相似问题