执行期间 CPU 使用率变得非常高

3
我最近构建了一个使用单个线程定期处理信息的服务。该服务是使用Microsoft Visual Studio 2010 Express构建的。我注意到CPU使用率飙升到了100%。
后来,出于好奇,我构建了一个非常小的程序,它只是启动一个小线程或计时器,然后运行一些非常长的循环。我还从构建控制台应用程序转换为Windows窗体应用程序。通过更改程序类型来构建,我能够减少麻烦。
我尝试降低线程的优先级:
System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Lowest;

我也尝试设置了优先级类别。

Process p = Process.GetCurrentProcess();
p.PriorityClass = ProcessPriorityClass.BelowNormal;

我曾认为CPU使用率可能是由于在虚拟机上运行而导致的。但这个理论没有给我带来任何进展,这很荒谬。我不知道该往哪里走了。我不确定为什么在.NET框架中启动计时器或线程会使我的CPU使用率飙升。当我构建COM对象时从未遇到过这种情况。有人有任何好主意可以指点一下吗?感谢您提前花费的时间。
2个回答

3

听起来你的代码正在无限循环并且出乎意料。

在Visual Studio调试器中启动代码,当你看到高CPU时,按下“Break”以暂停执行。重复执行此操作时,您看到的调用堆栈和其他程序状态应该让您了解逻辑出了什么问题。

通过调试器逐步执行代码可能会更快。这取决于代码的复杂性。


2

如果您的线程重复循环,这可能会导致CPU使用率过高。您是否尝试在循环之间添加一个暂停以减少线程执行次数?

Thread.Sleep(1000);

Thread.Sleep(1000) 帮助我理解了一切。真正的程序有点复杂。这是我写的非常小的程序的一部分:System.Threading.Thread th = new System.Threading.Thread(new ThreadStart(ThreadFunc)); th.Priority = ThreadPriority.Lowest; th.Start();public static void ThreadFunc() { System.Threading.Thread.Sleep(10000); or (long i = 0; i < 1000000000; i++) { } System.Threading.Thread.Sleep(10000); } - Coach Roebuck
原始程序的意图是处理信息,但它必须经常运行(例如每半小时或一小时)。我发现Windows计划程序只允许我按日程安排任务。我想使用线程来跟踪时间表,但我开始感觉这并不是很聪明的做法。因此,我愿意听取建议。 - Coach Roebuck
我认为我可能会转而使用Windows任务计划程序,而不是试图自己处理线程和定时器,以保持我的程序轻量级。谢谢大家,祝一切顺利。 - Coach Roebuck
那么:Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal; - RichieMN
我记得尝试过那个。似乎没有任何效果。考虑到那个特定项目的性质,它需要定期运行,我想最终我是通过Windows任务计划程序安排了一个任务。我相信我还能够减少CPU使用率。我必须追踪该项目和我启动此线程的时间,并分享一些源代码,希望能帮助别人。 - Coach Roebuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接