3

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

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

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

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

有没有人知道除了设置它的优先级较低或通过使用 PerformanceCounter/其他一些 CPU 监视器增加更多开销之外的方法?谢谢。

4

3 回答 3

2

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

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

于 2012-04-12T14:33:54.193 回答
2

不确定我是否以正确的方式理解您。您每 5 分钟检查一次文件,并且检查(或它们的处理)占用了其他进程太多的 CPU 时间?

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

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

暂停/睡眠的时间可能取决于到目前为止经过的时间量以及剩下的时间来做其他事情,例如,您可以为每个文件保留 10 毫秒;如果处理时间为 4 毫秒,则您睡眠 6 毫秒。

如果您不断检查文件以进行检查,请确保使用 aFileSystemWatcher代替,这应该可以解决您在这种情况下的问题。

于 2012-04-12T14:42:41.297 回答
0

CPU负载本身还不错,只要你不max out。只需降低进程的优先级就可以了。如果还有其他优先级更高的进程,它们将被优先处理。

Process thisProc = Process.GetCurrentProcess();
  thisProc.PriorityClass = ProcessPriorityClass.BelowNormal;
于 2012-04-12T14:54:54.280 回答