Thread.Sleep(1)takesmorethan1ms我搜索了这个问题,但没有看到答案。如果它是重复的,我会很乐意将其关闭。我目前正在尝试对一项技术进行一些性能评估,并看到一些非常令人难以置信的结果,所以我决定尝试一些。在那里,我想尝试看看秒表类是否返回了我预期的结果。秒表sw=Stopwatch.StartNew();线程.睡眠(1);sw.停止();Console.WriteLine(sw.ElapsedMilliseconds);在这种情况下,我几乎看到15毫秒的回报。我知道DateTime的分辨率是围绕着这个但Thread.Sleep(1)不应该让一个线程休眠1毫秒吗?我正在使用的系统返回Stopwatch.IsHighResolutiontrue并在.NET4中运行。背景:此代码以完整且正确的形式用于收集Aerospikedbget请求上的一些数字。数据库不在同一个框中。当我在查询进行到一半时打印出sw.ElapsedMilliseconds时,我看到的响应大多是亚毫秒级的,这听起来很可疑,考虑到我的Java等效项大部分时间返回更可信的5毫秒-15毫秒响应。Java代码使用System.nanoTime()作为区别。通过我的C#代码中的亚毫响应,我的意思是Console.WriteLine(sw.ElapsedMilliseconds)打印0。秒表以外的计时器由时钟中断递增。默认情况下,它在Windows上每秒运行64次。或15.625毫秒。所以小于16的Thread.Sleep()参数不会给你你想要的延迟,你总是会得到至少15.625的间隔。同样,例如,如果您读取Environment.TickCount或DateTime.Now并等待少于16毫秒,您将读回相同的值并认为已经过去了0毫秒。始终使用秒表进行小增量测量,它使用不同的频率源。它的分辨率是可变的,取决于主板上的芯片组。但你可以相信它比微秒更好。Stopwatch.Frequency为您提供速率。可以更改时钟中断率,您必须调用timeBeginPeriod()。这使您精确到毫秒,并且实际上使Thread.Sleep(1)准确无误。最好不要这样做,这是一种非常不友善的力量。我希望Thread.Sleep只不过是Win32SleepAPI的托管包装器。已知此API函数的分辨率较低。文档是这样说的:此函数导致线程放弃其时间片的剩余部分,并在基于dwMilliseconds值的时间间隔内变得不可用。系统时钟以恒定速率“滴答”。如果dwMilliseconds小于系统时钟的分辨率,线程可能会休眠少于指定的时间长度。如果dwMilliseconds大于1个滴答但小于2,则等待时间可以在1到2个滴答之间,依此类推。为了提高休眠间隔的准确性,调用timeGetDevCaps函数确定支持的最小定时器分辨率,并调用timeBeginPeriod函数将定时器分辨率设置为最小值。调用timeBeginPeriod时要小心,因为频繁调用会显着影响系统时钟、系统功耗和调度程序。如果调用timeBeginPeriod,请在应用程序早期调用一次,并确保在应用程序结束时调用timeEndPeriod函数。休眠间隔结束后,线程就可以运行了。如果指定0毫秒,线程将放弃其剩余的时间片但保持就绪状态。请注意,不保证就绪线程会立即运行。因此,线程可能要等到睡眠间隔之间的某个时间过去后才会运行。有关详细信息,请参阅规划优先级。因此,您可以按照建议使用timeBeginPeriod和timeEndPeriod来提高计时器分辨率,但实际上并不推荐这样做。如果你真的需要短时间阻塞,那么我建议你找到更好的解决方案。例如多媒体计时器。是的,你的想法是完全正确的。Thread.Sleep不保证在N毫秒内释放。它将确保Sleep不会在N毫秒之前被释放。换句话说,Thread.Sleep(1)意味着睡眠至少1毫秒。操作系统不会在特定的时间为特定的线程安排时间片。在指定时间内,操作系统不会调度线程执行。此方法更改线程的状态以包含WaitSleepJoin。从Msdn搜索“线程睡眠解决方案”提出了这些相关的SO问题:共识是默认情况下Sleep()至少需要15毫秒,除非您使用timeBegin/EndPeriod()设置分辨率,如本答案所示。Thread.Sleep(n)表示阻塞当前线程至少可以发生n毫秒的次数(或线程量程)。时间片的长度因Windows的不同版本/类型和不同的处理器而异,通常在15到30毫秒的范围内。这意味着线程几乎可以保证阻塞超过n毫秒。您的线程在n毫秒后被完全唤醒的可能性几乎是不可能的。所以Thread.Sleep对于计时是没有意义的。Thread.Sleep(1)将使线程休眠1ms,但您通常无法获得该精度。但是,一旦线程进入休眠状态,内核需要时间将其放回就绪队列,等线程真正再次运行时,再将其置于运行状态。所有这些因素都取决于平台、CPU数量、其他进程数量等。非RT操作系统无法保证。以上就是C#学习教程:Thread.Sleep(1)耗时1ms以上,分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
