我有一个用C#编写的命令行EXE。它是日志解析器,每晚都会研磨几GB的日志文件。
它将处理器固定在100%很长一段时间。不理想。
我怎么能“扼杀”应用程序?它可能需要多长时间,但我宁愿使用更少的总CPU。
是否有一些编码方法或理论可以使EXE变慢并减少CPU占用?我无法在它运行的环境中做任何事情(比如更改进程优先级),因此任何更改都必须在应用程序本身的代码中。
答案 0 :(得分:8)
试试这个:
using System.Diagnostics;
Process myProc = Process.GetCurrentProcess();
myProc.PriorityClass = ProcessPriorityClass.BelowNormal;
如果不够低,则有ProcessPriorityClass.Idle
答案 1 :(得分:6)
您可以使用Thread.Priority
属性设置线程的优先级。
当然,如果没有其他任何尝试运行的话,仍然会使用100%的CPU - 但我想在这种情况下你并不介意这么多。
您的应用程序是否创建了任何其他线程或使用线程池?如果是这样,您可能希望确保这些线程的优先级降低。
编辑:设置流程的总体优先级通常可能是更好的解决方案,但我会将此作为替代方案。
答案 2 :(得分:6)
你还可以在主循环中引入一个缓慢的睡眠,它将处理器挂起。
例如,这通常是通过游戏循环完成的 - 每帧调用Thread.CurrentThread.Sleep(1);
一次将使大多数游戏从使用100%cpu到使用1-2%cpu,并且仍允许合理访问。
-----编辑------
睡眠优于降低进程或线程的优先级有潜在的优势。主要的两个是:
-----来自原创-----
对于其他样式(UI)应用程序,另一个选项是重构您的例程以使其异常,将处理分解为多个部分,并通过订阅Application.OnApplicationIdle之类的内容在调用中处理它。这可以让你的用户界面保持一定的响应速度,因为它会在spurts中运行。
如果这是一个数学例程,而且它正在进行大量的计算,那么降低线程优先级并允许它使用最多的CPU可能会更好。
答案 3 :(得分:4)
由于您说您无法更改流程优先级,因此您唯一的选择是插入人工延迟,如前一个答案所述。如果在记录循环中插入Thread.Sleep(1),则最多每秒处理1,000条记录。如果你想要更精细的东西,那么你必须每N个记录插入一次睡眠。
答案 4 :(得分:3)
尝试
Process thisProc = Process.GetCurrentProcess();
thisProc.PriorityClass = ProcessPriorityClass.BelowNormal;//Or ProcessPriorityClass.Idle
答案 5 :(得分:0)
如果程序花费大量时间处理文件数据,那么您应该考虑asynchronous IO。您还可以将程序拆分为多个部分/多个线程,这些部分/多个线程在它们之间暂停计划