2010-11-18 65 views
3

私は最近、定期的に情報を処理する単一のスレッドを使用してサービスを構築しました。このサービスは、Microsoft Visual Studio 2010 Expressを使用して構築されました。私は、CPU使用率が月に近づいていることに気付きました(CPU使用率は100%)。実行中にCPU使用率が非常に高くなる

その後、好奇心の渦中に、小さなスレッドやタイマーを起動して、非常に長いループを走らせる非常に小さなプログラムを作りました。また、コンソールアプリケーションをWindowsフォームアプリケーションに変更しました。ビルドするプログラムの種類を切り替えることで、私のトラブルを減らすことができました。

System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

私もCPU使用率がしてきたことができると考え

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

私も優先度クラスを設定しようとしました:

私は、スレッドの優先順位を下げてみました仮想マシン上で実行されているために高いです。しかし、その理論は私をどこにも連れてこなかった。それはかなりばかげている。私はどこに向かうべきかわからない。なぜタイマーやスレッドを起動するのが天井から.NETフレームワークでのやり方でCPU使用量を送信するのかわかりません。私はCOMオブジェクトを構築するときにこれを経験したことはありません。誰も私がどこに向けることができるかについての明るい考えを持っていますか?

お時間をありがとうございます。

答えて

2

スレッド内で繰り返しループしている場合は、CPU使用率が高くなる可能性があります。あなたはループ間のスレッド実行に一時停止を追加しようとしましたか?

Thread.Sleep(1000); 
+0

Thread.Sleep(1000)はすべてを理解するのに役立ちました。実際のプログラムはやや複雑です。これは、私が書いた非常に小さなプログラムの一部です: System.Threading.Thread th = new System.Threading.Thread(新しいThreadStart(ThreadFunc))); th.Priority = ThreadPriority.Lowest; th.Start(); public static void ThreadFunc() { System.Threading.Thread.Sleep(10000); または(long i = 0; i <1000000000; i ++){} System.Threading.Thread.Sleep(10000); } –

+0

元のプログラムの意図は情報を処理することでしたが、頻繁に実行する必要がありました(たとえば、1時間半、1時間など)。 Windowsスケジューラでは、毎日だけ頻繁にタスクをスケジュールすることができます。私はスケジュールを追跡するためにスレッドを使用すると思っていましたが、私はそれが非常に巧妙ではないことを感じ始めています。だから、私は提案のために開いている。 –

+0

私は自分のことをやり直すのではなく、Windowsのタスクスケジューラを使い、スレッドやタイマーを使って自分のプログラムを軽量に保つことができると思います。 ありがとうございました。 –

3

あなたのコードのようなサウンドは無限に突然ループしています。

Visual Studioデバッガで起動し、CPUが高い場合は「ブレーク」を押して実行を一時停止します。コールスタックとこれを繰り返し実行するときに表示されるその他のプログラム状態は、あなたのロジックに何が間違っているかのアイデアを与えるはずです。

デバッガでコードをステップ実行するだけで簡単に処理できる可能性があります。コードの複雑さによって異なります。

関連する問題