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

标签 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();
        }
    }
}


结果是190 ms

最佳答案

因为Thread.Sleep(n)表示:至少n个毫秒。

前段时间I wrote an answer(尽管在另一个主题上),其中包含an external reference


  Thread.Sleep(n)表示至少阻止当前线程数
  n中可能出现的时间片(或线程量子)的数量
  毫秒。
  时间片的长度在不同的版本/类型上有所不同
  Windows和不同的处理器,通常为15到30
  毫秒。这意味着线程几乎可以保证为
  超过n毫秒。您的线程将出现的可能性
  精确地在n毫秒后重新唤醒几乎是不可能的
  不可能是可以的。因此,Thread.Sleep对于计时没有意义。


根据MSDN


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

关于c# - 如果使用Thread.Sleep进行检查,为什么秒表似乎不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28279188/

相关文章:

c# - 使用 C# 缩小 Jpeg 图像的效果不佳

r - 秒表作为 shiny for R 的输入

c# - .Net 桌面应用程序和 Web 应用程序之间的技术区别是什么?

c# - 动态添加多个按钮到 wpf 窗口?

c# - 如何使用 Roslyn 初始化对象

java - Java 中的 Swing 计时器秒表

ios - swift |计时器不会在无效调用时停止,而是加速?

flutter - 我可以用初始值启动 dart 秒表吗?

java - 如何在java中制作倒数倒数计时器(秒表Java)

C# 编译器不限制浮点文字小数部分的位数