while(true) 无限循环是否钉住 CPU?

Phi*_*ler 3 c# infinite-loop while-loop

我有一种情况,我需要在服务中运行一个恒定循环,每次检查某些条件,然后根据需要采取行动。从设计的角度来看,使用while (true)循环非常适合:

while (true)
{
    Process();
}
Run Code Online (Sandbox Code Playgroud)

Process() 方法检查内存中(快速)数据存储的状态。如果它发现基于状态有工作要做,它会使用它处理它Task.Run()(因此控制立即返回到循环)。

我已经看到一些参考资料,这会消耗不必要的 CPU 周期,我应该使用Timer, 或添加Thread.Sleep到循环中。我还看到帖子说使用while (true).

在我的开发机器上,虽然 CPU 使用率确实上升了,但它似乎没有负面影响。可能是 CPU 使用率分布在多个核心上,而部署环境可能只有一个核心。

while (true)循环是否对 CPU 产生负面性能影响,如果是,减轻影响的正确方法是什么?

Phi*_*tle 5

答案当然是这取决于你在做什么

一个while(true)循环本质上并不造成不好的性能上它自己。性能危险发生在方法体中,在这种情况下Process()

如果该方法旨在永远运行并且永不休息,则此构造很好。但是,如果Process应该响应事件或“监听”发生的事情,将其置于while(true)循环中可能会导致您的处理器进行不必要的轮询。

例如,

while (true)
{
   //At the start of every minute
   if (DateTime.Now.Seconds == 0)
       //Do Something
}
Run Code Online (Sandbox Code Playgroud)

这将是非常糟糕的。你让你的 CPU 不断地检查一个每分钟只为一次的条件,并阻止 CPU 在其余时间做有用的工作。

在这种情况下,您最好使用Threading命名空间中的一些可用功能来释放 CPU。