Thread.Sleep的精度仍然很差吗?
作者:互联网
我给人的印象是Thread.Sleep(x)不够精确,它所要做的就是使线程休眠最少xms.参见here、here和here.
当睡眠时间很短时,例如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