做一个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)
循环本身并不会导致糟糕的性能。性能危险发生在方法体中,在本例中是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()
,但你必须经常自己调用它,它的使用表明你正在做一些真正属于它自己的线程的事情。)