其他分享
首页 > 其他分享> > Thread.Sleep的精度仍然很差吗?

Thread.Sleep的精度仍然很差吗?

作者:互联网

我给人的印象是Thread.Sleep(x)不够精确,它所要做的就是使线程休眠最少xms.参见hereherehere.

当睡眠时间很短时,例如1ms,预计您会发现线程偶尔会休眠约15ms.由于时钟中断速率默认为每秒64次,因此该值为apparently.

我在几年前尝试过,确实,我也体验过15ms的分辨率.但是,我刚刚再次尝试过,现在我看到1ms到2ms的分辨率,很少出现> 2毫秒

有什么变化? .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();

}

解决方法:

Thread.Sleep(以及kernel32中基本的Windows API Sleep函数)的精度取决于系统时钟的分辨率,该时钟的默认刻度速率约为15 ms.应用程序可以请求更高的分辨率,在这种情况下,全局使用最高的请求分辨率.

在这种情况下,您可能会看到15毫秒以下的分辨率,因为系统上运行的某些程序要求更高的分辨率.

如果您的应用程序实际上需要15毫秒以下的睡眠时间,则可以通过本机timeBeginPeriod功能请求更高的分辨率.

但是,请注意,底层计时器设备可能不支持您请求的分辨率,因此,除非您完全确定要在其上运行的硬件,否则编写依赖此行为的代码不是一个好习惯.

标签:thread-sleep,windows-server-2016,windows,c
来源: https://codeday.me/bug/20191025/1925114.html