Thread.Sleep(0) vs Thread.Sleep(1) vs Thread.Sleep(2)



如果我没有弄错,Thread.Sleep(0)将把调用线程的时间片交给优先级等于或高于调用线程的任何其他线程,而Thread.Sleep(any number larger than zero)将把它交给任何等待线程。

现在,我脑海中浮现出一种想法,在C#3或4之前,Thread.Sleep(0)只会放弃给优先级更高的线程,Thread.Sleep(1)放弃给更高优先级或相同优先级,Thread.Sleep(2)放弃给任何优先级。我说得对吗?

Thread.Sleep(n); // Where n is milliseconds

当N==0时

这告诉系统你想放弃线程的剩余时间片,让另一个等待线程(其优先级>=currentThread(运行(这意味着你不确定何时恢复控制(
如果没有其他优先级相同的线程可以运行,则当前线程的执行不会挂起。

当N>=1(无论是N=1还是N=2(

将阻塞当前线程至少n毫秒内可能发生的时间片(或线程数量(,换句话说,它将无条件地将剩余的时间片放弃给任何其他线程。

Windows线程调度程序确保每个线程(至少是具有相同优先级的线程(都能获得公平的CPU执行时间。阻塞当前线程至少指定间隔的原因是,调度程序可能需要比指定间隔更长的时间才能再次到达该线程

参考文献:1、2、3


更新

在我寻找Sleep在C#3之前版本中的工作时,我遇到了一些有趣的文章(2005年及之前(,我觉得值得更新。

简言之,当n=1或n=2时,我没有发现线程放弃更高或相同优先级有任何区别。

来自金库:1,2,3

最新更新