2011-11-27 6 views
5

私は何度も何度も実行したいタスクがあります。私はこれをできるだけ早く呼びたいと思っていますが、私は自分のCPUサイクルを低く保ちたいと思っています。私はバックグラウンドワーカーで睡眠を使用することをお勧めします。しかし、睡眠なしで私のCPUは約55%のままです。私は以下の私のソースの例を持っています。睡眠が適切であれば、どのように睡眠に最適な時間を選ぶか、次の結果からわかるように、私は睡眠の長さに基づいて異なる結果を得ます。ベストプラクティスは、マルチスレッドで同様のバックグラウンド労働者CPUを減らすためにスリープ

BackgroundWorker _Worker = new BackgroundWorker() 
{ 
    WorkerReportsProgress = true, 
    WorkerSupportsCancellation = true 
}; 

void Worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // do my task here 

    // if i uncomment one of the Sleep below I reduce the CPU like so 
    // no sleep    CPU = 52-58% 
    // Thread.Sleep(1);  CPU = 09-15% 
    // Thread.Sleep(10); CPU = 02-03% 
    // Thread.Sleep(100); CPU = 00-01% 
} 

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) { return; } 

    _Worker.RunWorkerAsync(); 
} 
+0

どのように使用しているかによって、おそらくタイマーが適切でしょう。 –

+0

私はタイマーについて考えましたが、私の仕事は5秒から5分の時間がかかりましたので、私は背景職人がより良い選択だと思っていました。 – poco

+2

なぜCPU%について懸念していますか?システムの残りの部分が応答性を保っていることを確認したい場合は、優先度の低いスレッドに置くほうが適切でしょう。 –

答えて

1

何かをしているとき何を誰かが私に知らせることができ、それはあなたがマシンを消費したくない場合に優先度の低いバックグラウンド作業を設定するのが一般的です。それはどんなCPUが残っても使用します。つまり、100%になるかどうか気にする必要はありません。

しかし、BackgroundWorkerの問題は、優先度を設定できないことです。

別のオプションは、プライオリティを設定できる独自のスレッドを生成することです。

ここで別のSOポスト関連です:

.NET Backgroundworker Object's Thread Priority

また、別の(おそらくあまり惹か)オプションは、別のプロセスに重い仕事を入れて、それが低い優先順位を実行することです。進行状況の多くを伝える必要がない場合は、簡単です。それ以外の場合は、通信チャネルを開く方が複雑です。あなたの背景は低い優先順位があなたの処理が(ちょうどそれを十分に低い優先順位を与える)他の機能と干渉しないようになりますスレッド与える

How do I launch a process with low priority? C#

0

。しかし、それはあなたのための解決策ですか?バックグラウンド作業を継続的に実行したい。多分、ゆっくりと走っているのは良い選択肢ではないでしょうか?

あなたは何ですか?実際にはを達成しようとしていますか?

1

決定的な睡眠は、ほとんどのシナリオ(あなたのケースでは乱数であり、完璧な最適化ではありません)にある最適な最適化ではありません。rather wait and signalが最適です。今のところスレッドの優先度を下げてみることもできますが、最高のパフォーマンスを得るためには、待ち時間とシグナルのパラダイムを使用することを強くお勧めします。

関連する問題