32

我有一种方法,它使用后台工作人员轮询 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()的应用程序在我的 PC 上运行高达 50%。我的 CPU 百分比保持在Sleep(1)6%。有人告诉我应该选择Thread.Yield(),但是 CPU % 的峰值困扰着我。这样的事情的最佳做法是什么?

4

1 回答 1

32

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

使调用线程让步给准备好在当前处理器上运行的另一个线程。操作系统选择要屈服的线程。

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

阻塞当前线程指定的毫秒数。

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

于 2012-07-14T04:12:34.227 回答