我有一个使用后台工作者来轮询 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使用率的波动令我困扰。对于这种情况,最佳实践是什么?
Threading.Timer
来进行轮询处理?如果你正在使用 .NET 4.0,你可以将其与 TPL 混合使用,以实现基于任务的协作取消。 - Bryan Crosby