如果使用Thread.Sleep检查,为什么秒表似乎不准确?

MrG*_*sen 1 c# stopwatch

我尝试实现.NET Stopwatch以获得乐趣,但我得到了一些意想不到的结果.

我完全期待这个程序的执行时间大约为100毫秒.

是Stopwatch类不准确或这到底是怎么回事呢?

码:

namespace Timer
{
    class Program
    {
        Stopwatch s = new Stopwatch();

        static void Main(string[] args)
        {
            s.Start();
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(1);
            }
            s.Stop();

            Console.WriteLine("Elapsed Time " + s.ElapsedMilliseconds + " ms");

            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是 190 ms

And*_*air 9

因为Thread.Sleep(n)意味着:至少 n msces.

前段时间我写了一个答案(虽然在另一个主题上),其中包含一个外部参考:

Thread.Sleep(n)表示阻止当前线程至少在n 毫秒内可能发生的次数(或线程量子).时间片的长度在不同版本/类型的Windows和不同处理器上是不同的,通常在15到30毫秒的范围内.这意味着线程几乎可以保证阻塞超过n毫秒.你的线程在n毫秒之后完全重新唤醒的可能性几乎是不可能的. 所以,Thread.Sleep时机毫无意义.

根据MSDN:

系统时钟以称为时钟分辨率的特定速率滴答.实际超时可能不完全是指定的超时,因为指定的超时将调整为与时钟周期一致.