做一个while(true)无限循环固定CPU

本文关键字:无限循环 CPU true 一个 while | 更新日期: 2023-09-27 18:18:27

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

while (true)
{
    Process();
}

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

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

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

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

做一个while(true)无限循环固定CPU

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

while(true)循环本身并不会导致糟糕的性能。性能危险发生在方法体中,在本例中是Process()

如果该方法打算永远运行并且永远不中断,那么这种构造是可以的。然而,如果Process应该响应事件或"监听"发生的事情,将其放在while(true)循环中可能会导致处理器不必要的轮询。

例如,

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

这太糟糕了。你让你的CPU不断检查一个每分钟才为真一次的条件,并阻止CPU在剩余的时间里做有用的工作。

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

在协作多任务系统中,这确实会占用CPU(或至少一个核心)。

然而,大多数现代操作系统采用抢占式多任务,这基本上意味着操作系统控制进程获得多少时间。因此,尽管你的循环将使用100%的线程(或进程)时间,并剥夺其他的一些 CPU时间,操作系统将确保其他准备运行的进程/线程有时间这样做。所以在最坏的情况下,你会放慢一些速度。

您需要特别注意的一件事是,这样的循环将占用运行它的线程,使该线程不可用于其他事情。例如,你不想在UI线程上做。(有Application.DoEvents(),但你必须经常自己调用它,它的使用表明你正在做一些真正属于它自己的线程的事情。)