C# Thread.Sleep、Thread.Yield和Task.Delay

Thread.Sleep(n)

  Sleep 的意思是告诉操作系统自己要休息 n 毫秒,这段时间就让给另一个就绪的线程吧。相比 Yield,可以调度任何处理器的线程使用时间片。在休息的 n 毫秒时间内,即使没有其他就绪线程,自己也不再占用CPU。

  当 n=0 的时候,意思是要放弃自己剩下的时间片,但是仍然是就绪状态,其实意思和 Yield 有点类似。但是 Sleep(0) 只允许那些优先级相等或更高的线程使用当前的CPU,其它线程只能等着挨饿了。如果没有合适的线程,那当前线程会重新使用 CPU 时间片

 

Thread.Yield()

  主动放弃当前线程的时间片,并让操作系统调度其它就绪态的线程使用一个时间片。但是如果调用 Yield,只是把当前线程放入到就绪队列中,而不是阻塞队列。如果没有找到其它就绪态的线程,则当前线程继续运行。Yield可以让低于当前优先级的线程得以运行,调用者可以通过返回值判断是否成功调度了其它线程。注意,Yield只能调度运行在当前CPU上的线程

 

Thread.Sleep与Task.Delay比较

Thread.Sleep同步等待会阻塞当前线程,Task.Delay异步等待并且可以取消等待

posted @ 2021-01-01 20:43  温故纳新  阅读(815)  评论(0编辑  收藏  举报