Thread.Sleep() 分辨率从 1 到 15.6 毫秒不等
鉴于此控制台应用程序:
class Program
{
static void Main()
{
int outer = 100;
int inner = 100;
Stopwatch sw = new Stopwatch();
for (int j = 0; j < outer; j++)
{
int i;
sw.Restart();
for (i = 0; i < inner; i++)
Thread.Sleep(1);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
}
}
我预计输出是接近 100 的 100 个数字。相反,我得到了这样的结果:
99 99 99 100 99 99 99 106 106 99 99 99 100 100 99 99 99 99 101 99 99 99 99 99 101 99 99 99 99 101 99 99 99 100 99 99 99 99 99 103 99 99 99 99 100 99 99 99 99 813 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1560 1559 1559 1559 1559 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1559 1558 1558 1558 1558 1558
但有时我不会得到任何准确的结果;每次都是〜1559。
为什么不一致?
一些谷歌搜索告诉我 15.6 毫秒是时间片的长度,这解释了 ~1559 的结果。但为什么有时我会得到正确的结果,而有时我只是得到 15.6 的倍数?(例如 Thread.Sleep(20) 通常会给出 ~31.2ms)
它如何受硬件或软件的影响?
我之所以这样问,是因为是什么让我发现了它:
我一直在 32 位双核机器上开发我的应用程序。今天我的机器升级到 64 位四核并重新安装了完整的操作系统。(Windows 7 和 .NET 4 在这两种情况下,但我不能确定旧机器有 W7 SP1;新机器有。)
在新机器上运行我的应用程序后,我立即注意到我的表单需要更长的时间才能淡出。我有一个自定义方法来淡化我的表单,它使用 Thread.Sleep() 值从 10 到 50 不等。在旧系统上,这似乎每次都能完美运行。在新系统上,褪色所需的时间比应有的要长得多。
为什么我的旧系统和新系统之间的这种行为会发生变化?这与硬件或软件有关吗?
我可以让它始终准确吗?(~1ms 分辨率)
我可以在我的程序中做些什么来使 Thread.Sleep() 可靠地精确到大约 1 毫秒吗?甚至10毫秒?