代码之家  ›  专栏  ›  技术社区  ›  pookie

是精确的线程。睡眠还穷吗?

  •  3
  • pookie  · 技术社区  · 6 年前

    Thread.Sleep(x) 是不精确的,它所能做的就是在 最低限度 x See女士 here , here here .

    当睡眠时间很短时,例如。 1ms 15ms . 这是 apparently 64 每秒次。

    几年前我试过这个,事实上,我也经历过 千分之一秒 2ms 分辨率极少大于2ms。

    发生了什么变化?.NET是否已更改(我正在使用) 4.6 现在,不记得两年前我用过什么了?也许是操作系统改变了?(我使用过并且现在仍在使用AWS EC2 Windows Server,但可能已经有了更新。)

    private static Stopwatch sw =new Stopwatch();
    static void Main(string[] args)
    {
        var timer = new Stopwatch();
        var results = new List<long>();
        for (int i = 0; i < 100000; i++)
        {
            timer.Restart();
            Thread.Sleep(1);
            results.Add(timer.ElapsedMilliseconds);
        }
    
        foreach (var item in results.Where(x => x > 1).ToList())
        {
            Console.WriteLine(item );
        }
    
        Console.ReadLine();
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   user2864740 Heinzi    6 年前

    精密度 Thread.Sleep Sleep 内核32)中的函数取决于系统时钟的分辨率, 它的默认滴答声频率大约为15毫秒 全局使用请求的最高分辨率 .

    在这种情况下,您可能会看到低于15毫秒的分辨率,因为系统上运行的某些东西要求更高的分辨率。

    如果您的应用程序实际需要低于15毫秒的休眠,它可以通过本机请求更高的分辨率 timeBeginPeriod

    但是,请注意,底层计时器设备可能不支持您请求的解析,因此编写依赖于此行为的代码是不好的做法,除非您完全确定代码将在哪个硬件上运行。