首页 > 解决方案 > Thread.Sleep(0) 与 Thread.Sleep(1) 与 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)任何优先级。我对吗?

标签: c#multithreading

解决方案


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

当 N==0

这告诉系统您要放弃线程的其余时间片并让另一个等待线程(其优先级> = currentThread)运行(这意味着您无法确定何时恢复控制权)。
如果没有其他同等优先级的线程准备好运行,则不会暂停当前线程的执行。

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

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

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

参考文献:1 , 2 , 3


更新

为了在 C# 3 之前的版本中找到Sleep的工作原理,我遇到了一些有趣的文章(在 2005 年及之前),我认为这些文章值得更新。

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

从保险库: 1 , 2 , 3


推荐阅读