我有一个方法,它使用后台工作程序来轮询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%。使用Sleep(1)时,我的CPU %保持在6%。有人告诉我应该选择Thread.Yield(),但是CPU %的峰值困扰着我。对于这样的事情,最佳实践是什么?
发布于 2012-07-14 12:12:34
Thread.Yield将中断当前线程以允许其他线程执行工作。但是,如果它们没有任何工作要做,您的线程将很快被重新调度,并将继续轮询,因此1核的利用率为100%。
使调用线程将执行交给准备在当前处理器上运行的另一个线程。操作系统选择要让步的线程。
Thread.Sleep将安排您的线程在休眠时间到期后再次运行,从而大大降低CPU利用率。
在指定的毫秒数内阻塞当前线程。
在两者之间进行选择时,Thread.Sleep更适合您的任务。然而,我同意@Bryan的评论,即Threading.Timer会带来更优雅的解决方案。
https://stackoverflow.com/questions/11480912
复制相似问题