2012-04-12 19 views
3

編集済み:もともと2つの質問があり、自分自身でテストして答えを得ました。C#スレッドのCPU使用量を制限する

私は、フォルダセット内のファイルを検索するスレッド型リーダー/ライターを作成しています。これは、ユーザーが指定した場合は5分ごとに実行されます。

私の現在の問題は、スレッドがあまりにも多くの貪欲を伴うファイルを見ることです。スレッドをCPUの最大30%(または、ユーザーが指定した量より速く/遅くしたい場合に備えて)に制限する必要があります。これは、これが常にオンになっているはずのプログラムであり、インターネットをブラウズしたり他のプログラムを同時に使用したりするのを妨げたくないからです。私は個人的には、優先度を低く設定しても、100%のCPUを使用しているスレッドプログラムが他のプログラムと一緒に使用されていることに気付き、これを回避しようとしています。

私はPerformanceCounterを使用してCPU使用率を確認し、うまくいけばプログラムを特定し、(CPU全体または特定のプログラムのCPUのパフォーマンスがピークに達する) 。私はスレッドのCPU使用率を制限するためのドキュメントは見つけられませんでした。なぜなら、 "本当に実現できない"理由がないからです(これは完全に大丈夫です - ほとんどの人はスレッドをできるだけ早く実行したい、 .NETや他のC#ライブラリに固有のやり方です)。

他の方法で優先度を低く設定する方法や、PerformanceCounter /その他のCPUモニタを使用してオーバーヘッドを追加する方法について知っていますか?ありがとう。

+2

[この](http://stackoverflow.com/a/482622/884410)答え –

+0

をチェックしてください、あなたは必ずあなたの問題はCPU使用率ではなく、ディスクI/Oですか? –

+0

@MattBurland - yup - それを掲載しようとしています。私はちょうど、CPUバインドされたタスクのための最適なスレッドプール深さの調査を行ってきました。私はプールスレッドが 'THREAD_PRIORITY_BELOW_NORMAL'に設定されているので、8/16/32/80/800スレッドを4/8コアで100%実行していましたが、ブラウザなどはすべて正常に動作しました。 –

答えて

2

現在、フォルダの監視方法についてはわかりませんが、FileSystemWatcherクラス(http://msdn.microsoft.com/en-us/library/system.io)を参照してください。 .filesystemwatcher.aspx)。

変更を行うために特定のパスを監視するように設定することができ、CPU使用率は非常に低くなります。それは非同期型(つまり、別のスレッドを必要としないため)です。

+0

ありがとう、おそらく最高の答えですが、これはフォルダ/ txtデータベースをループしており、多数のファイルとサブファイルを見ているファイルになります。それが高すぎるのを見た場合は、通常、X時間ごとに同じCPUを発行することになります。それがあまりにも低すぎると見れば、最終的には百万人になるでしょう。 – Charles

2

私が正しい方法であなたを理解しているかどうかはわかりません。あなたは5分ごとにファイルをチェックし、そのチェック(またはその処理)は他のプロセスからCPU時間がかかり過ぎますか?

の場合、Thread.Sleepを使用して処理(ファイル間など)を一時停止するとどのように減速しますか?

私は本当にあなたが最大CPU負荷について心配する必要はないと思っています(これは設定が面倒であるかもしれないし、マルチコアCPUと同じように混乱するかもしれません。 1つのコアに%または合計で100%?)。

一時停止/スリープの時間は、これまでに経過した時間量と他の処理を行うまでに要した時間量によって決まります。ファイルごとに10ミリ秒を予約することができます。処理に4msかかった場合、6msの間スリープ状態になります。

ファイルを継続的にチェックして確認している場合は、代わりにFileSystemWatcherを使用してください。この場合、問題が解決するはずです。

0

CPUの負荷自体は、最大限にしない限り悪くありません。 プロセスの優先度を下げるだけで問題ありません。優先順位の高い他のプロセスがある場合は、優先順位が付けられます。

Process thisProc = Process.GetCurrentProcess(); 
    thisProc.PriorityClass = ProcessPriorityClass.BelowNormal; 
関連する問題