2012-04-12 260 views
3

編輯了:原來說兩個問題,一個測試自己,得到的答案。C#限制線程的CPU使用率

我創建一個線程讀取/寫入器,看起來比文件夾集。它每5分鐘執行一次,或者如果用戶指定它,則更少。

我目前的問題是,線程會看太多貪婪的文件。我想限制線程最多使用30%的CPU(或用戶指定的數量,以防他們想要更快/更慢)。原因是這是一個應該始終開啓的程序,我不希望它們在同一時間瀏覽互聯網或使用其他程序來干擾他們。我個人傾向於指出,即使將它們設置爲較低優先級,也可以將100%的CPU螺釘與其他程序一起使用,並試圖避免這種情況。

我想使用的PerformanceCounter檢查CPU使用率,希望找出程序,並在添加更多的睡眠週期的,如果(在CPU作爲一個整體,或我的具體發現它的程序)的性能開始高峯。我還沒有發現任何文件上限制其他線程,然後CPU使用率「哈哈,何必呢?」,「不真正可行的」,沒有理由(這是完全正常 - 大多數人都希望線程儘快完成,有可能是沒有方式來做到.Net或另一個C#庫固有的這一點)。

有誰知道一種方式,然後設置它的優先級較低,或通過使用PerformanceCounter /一些其他CPU監視器添加更多開銷?謝謝。

+2

退房[這](http://stackoverflow.com/a/482622/884410)回答 – 2012-04-12 14:35:05

+0

你確定你的問題是CPU佔用率,而不是磁盤I/O? – 2012-04-12 14:37:15

+0

@MattBurland - 是的 - 即將發佈。我剛剛爲CPU限制任務的調查做了一些「最佳線程池深度」。我的8/16/32/80/800線程以100%的速度在我的4/8內核上運行,但由於線程池的線程設置爲'THREAD_PRIORITY_BELOW_NORMAL',我的瀏覽器等工作都很好。 – 2012-04-12 14:45:52

回答

2

我不確定你目前在做什麼文件夾看,但我認爲你應該看看FileSystemWatcher類(http://msdn.microsoft.com/en-us/library/system.io .filesystemwatcher.aspx)。

您可以將其設置爲觀察特定路徑進行更改,並且CPU使用率非常低。它也是異步的(所以你甚至不需要單獨的線程)。

+0

謝謝,也許是最好的答案,但是這是通過一個文件夾/ TXT數據庫循環和將文件看大量的文件和子文件。如果它看上去太高,那麼我會每隔X時就會有一個CPU出現問題。如果它看的太低,那麼最終會有一百萬。 – Charles 2012-04-23 16:08:08

2

不知道如果我理解你正確的方式。你每5分鐘檢查一次這些文件,檢查(或者它們的處理)會佔用其他進程的CPU時間。

如果是這樣,那麼如何通過使用Thread.Sleep暫停介於兩者之間的處理(例如文件之間)來減慢速度?

我真的不認爲你應該擔心一些最大的CPU負載(加上配置,這可能是對於用戶來說是麻煩或混淆爲多核CPU上,它並不總是很清楚什麼100%的CPU使用的實際上是,是100 %在一個核心或總共100%?)。

暫停/睡眠的時間可能取決於到目前爲止所經過的時間量以及剩餘時間來完成其他事情的時間量,例如,你可以保留每個文件10毫秒;如果處理花費了4毫秒,你會睡6毫秒。

如果您不斷檢查要檢查的文件,請確保使用FileSystemWatcher代替,這可以解決您在這種情況下遇到的問題。

0

CPU負載本身並不壞,只要你不這樣做最大程度的發揮。 只需減少過程的優先級就可以了。如果有更高優先級的其他進程,則會優先考慮。

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