C#限制线程CPU使用率

时间:2012-04-12 14:31:19

标签: c# multithreading backgroundworker

编辑出:最初陈述了两个问题,我自己测试了一个问题并得到答案。

我正在创建一个线程读取器/写入器,用于查看文件夹集中的文件。如果用户指定它,则每5分钟或更少时间执行此操作。

我目前的问题是,该主题会查看文件过于贪婪。我想限制线程使用最多30%的CPU(或用户指定的数量,以防他们想要更快/更慢)。原因是这是一个应该一直打开的程序,我不希望它干扰他们同时浏览互联网或使用其他程序。我个人倾向于注意到螺纹程序使用100%的CPU螺丝与其他程序,即使它们被设置为较低的优先级,并且我试图避免这种情况。

我正在考虑使用PerformanceCounter来检查CPU使用情况,希望能够识别程序,并在性能(整个CPU或特定程序中的程序)开始达到峰值时添加更多的睡眠周期。我没有找到任何关于限制线程CPU使用率的文档,除了“lol,为什么要打扰?”,“没有真正可行”,没有任何理由(这是完全正常的 - 大多数人都希望线程尽快完成,可能没有这样做的方法是.Net或其他C#库固有的。)

有没有人知道一种方法,然后将其优先级设置得更低,或者使用PerformanceCounter /其他一些CPU监视器增加更多开销?感谢。

3 个答案:

答案 0 :(得分:2)

我不确定你目前是如何看文件夹的,但我认为你应该看一下FileSystemWatcher类(http://msdn.microsoft.com/en-us/library/system.io。 filesystemwatcher.aspx)。

您可以将其设置为观察某个更改路径,并且CPU使用率非常低。它也是异步的(所以你甚至不需要一个单独的线程)。

答案 1 :(得分:2)

不确定我是否理解正确的方式。您每隔5分钟检查一次文件,检查(或处理)是否需要花费太多CPU时间来关闭其他进程?

如果是这样,如何通过使用Thread.Sleep暂停处理(例如文件之间)来减慢速度?

我真的不认为你应该担心一些最大CPU负载(加上配置这对于用户来说可能很麻烦或令人困惑,因为多核CPU并不总是清楚100%cpu实际使用的是100%在一个核心或总计100%?)。

暂停/睡眠的时间可能取决于到目前为止所经过的时间量和剩下的时间,例如,你可以保留每个文件10毫秒;如果处理时间为4毫秒,则会睡眠6毫秒。

如果您不断检查文件以进行检查,请确保使用FileSystemWatcher,这样可以解决您遇到的问题。

答案 2 :(得分:0)

CPU负载本身也不错,只要你没有最大化。 只需降低流程的优先级即可。如果还有其他具有更高优先级的流程,则会优先考虑它们。

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