Thread.Sleep或Thread.Yield

时间:2012-07-14 03:59:25

标签: c# multithreading sleep yield

我有一个方法,它使用后台工作程序轮询DLL以查找类似这样的状态:

var timeout = DateTime.Now.AddSeconds(3);
while (System.Status != Status.Complete  // our status is not complete
       && DateTime.Now < timeout         // have not timed out
       && !_Worker.CancellationPending)  // backgroundworker has not been canceled
{
    //Thread.Yield();
    //Thread.SpinWait(1);
    //Thread.Sleep(1);
}

查看我的CPU%时,yield()spinwait()会导致我的应用在我的电脑上拍摄高达50%。使用Sleep(1),我的CPU%保持在6%。有人告诉我,我应该选择Thread.Yield(),但CPU%的高峰会让我感到烦恼。对于这样的事情,最佳做法是什么?

1 个答案:

答案 0 :(得分:25)

Thread.Yield将中断当前线程以允许其他线程执行工作。但是,如果他们没有任何工作要做,您的线程很快就会被重新安排并继续进行轮询,从而100%利用1个核心。

  

使调用线程执行到另一个准备在当前处理器上运行的线程。操作系统选择要生成的线程。

Thread.Sleep将调度您的线程在睡眠时间到期后再次运行,从而大大降低CPU利用率。

  

阻止当前线程达到指定的毫秒数。

鉴于两者之间的选择,Thread.Sleep更适合您的任务。但是,我同意@Bryan的评论,即Threading.Timer可以提供更优雅的解决方案。