poc*_*oco 26 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);
}
Run Code Online (Sandbox Code Playgroud)
当看着我的CPU%,yield()并spinwait()导致我的应用程序来拍摄高达50%,我的电脑上.随着Sleep(1)我的CPU%,6%,保持了下来.我被告知我应该选择Thread.Yield(),但是CPU%的高峰会让我感到困扰.什么是这样的最佳做法?
Eri*_* J. 28
Thread.Yield将中断当前线程以允许其他线程执行工作.但是,如果他们没有任何工作要做,您的线程很快就会重新安排并继续轮询,从而100%利用1个核心.
使调用线程执行到另一个准备在当前处理器上运行的线程.操作系统选择要生成的线程.
Thread.Sleep将调度您的线程在睡眠时间到期后再次运行,从而大大降低CPU利用率.
阻止当前线程达到指定的毫秒数.
鉴于两者之间的选择,Thread.Sleep更适合您的任务.但是,我同意@Bryan的评论,即Threading.Timer一个更优雅的解决方案.
| 归档时间: |
|
| 查看次数: |
20992 次 |
| 最近记录: |