问题 如何限制C#程序的CPU使用率?


我正在开发一个C#程序,我有一个消耗太多CPU的功能。我想知道一种通过代码(不使用任何外部应用程序)来控制它的方法,并限制CPU使用率的百分比。 例如,如果它使用90%的CPU使用率,使我的应用程序仅消耗20%,即使它变慢。它必须在应用程序内自动完成。 如果你提供课程,那就太棒了。


1684
2017-10-30 18:15


起源

这听起来像一个拐杖:攻击症状而不是问题。为什么不发布该方法尝试的方法,并请求我们帮助优化方法。 - Joel Coehoorn
它可能是一个拐杖,但我可以想到这个想法的一些应用程序,例如:CPU绑定后台任务来处理数字,办公室PC的分布式计算环境中的节点,人工智能程序来监控和学习我的用法习惯。 - Brian Ensink
要将CPU使用率限制在50%,请在双核上运行;对于25%的上限,在四核上运行:D - Alan
我的想法就像Brian Ensink将在背景上运行应用程序,但限制是消耗周期的方式。四核的非常有趣的想法 - netadictos
@Coehorn:攻击症状可能听起来像一个拐杖,但它肯定是大多数医学博士和大多数制药行业的工作方式(尽管与编程无关)。 - Cecil Has a Name


答案:


我不知道你是否可以这样做,但你可以通过改变执行线程的线程优先级 优先 属性。你可以通过以下方式设置:

Thread.CurrentThread.Priority = ThreadPriority.Lowest;

另外,我认为你真的不想限制它。如果机器处于空闲状态,你会希望它忙于完成任务,对吗? ThreadPriority有助于将其传达给调度程序。


16
2017-10-30 18:20



这将有助于一些人,这是我所知道的唯一方式。 - Mitchel Sellers
这是正确执行此操作的最佳方式。 - Will
我已经看到Windows应用程序能够精确地限制自己...说50%的CPU。错误率低于1%。 - Andrei Rînea
精确封顶的好处究竟是什么?空闲周期被浪费了。 - dpurrington


您可以通过在循环内调用Thread.Sleep(毫秒)来减慢循环速度。这将CPU交给调度程序。

但是“消耗太多的CPU”让我觉得你可能有更多的基本问题。这个线程是否正在轮询并等待其他内容?如果是这样,您应该考虑使用事件或其他一些基于内核的信令机制。


0
2017-10-30 18:22





我想你需要查询某种OS API,以了解你消耗了多少CPU,并从中获取限制决策(如Thread.Sleep)。


0
2017-10-31 01:00