1

私はc#アプリのbackgroundworkerとdoworkの無限ループにいますが、backgroundworkerのCPU使用率は非常に大きくなっています(50%)。backgroundworkerのCPU使用率を制限するにはどうすればよいですか?

コード:

private void ScanWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        while (!worker.CancellationPending)
        {
            Process[] Procesy = Process.GetProcesses();

            foreach (Process Proces in Procesy)
            {

                List<BlaclistedProcess> blacklist = (from p in CurrentBlacklist.Processes
                                                     where p.ProcessName == Proces.ProcessName
                                                     select p).ToList<BlaclistedProcess>();

                if (blacklist.Count == 1)
                {
                    Proces.Kill();
                }
            }
        }
    }
4

5 に答える 5

1

ループ内で、バックグラウンドスレッドを特定の時間待機させることができます。

System.Threading.Thread.Sleep(100)
于 2013-03-24T16:01:32.400 に答える
1

タイマーを使用してそれらのプロセスを定期的にチェックする方が簡単です。別のスレッドでそれを行う必要はありません。

于 2013-03-24T16:04:47.177 に答える
0

コードに基づいて、いくつかのオプションがあります。

個人的には、現在のように数ミリ秒ごとにチェックを行う必要がないため、のTimer代わりにクラスを使用します。BackgroundWorker

使用を避けるもう1つの方法Thread.Sleep()は、クラスを使用して、Thread優先度を最低または通常より低く設定できるようにすることです。

于 2013-03-24T16:05:05.123 に答える
0

タイマーを使用する:

    var timer = new System.Threading.Timer(CheckProcesses);
    timer.Change(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1));
    //...
    timer.Dispose();

private void CheckProcesses(object state)
{
    Process[] Procesy = Process.GetProcesses();

    foreach (Process Proces in Procesy)
    {

        List<BlaclistedProcess> blacklist = (from p in CurrentBlacklist.Processes
                                             where p.ProcessName == Proces.ProcessName
                                             select p).ToList<BlaclistedProcess>();

        if (blacklist.Count == 1)
        {
            Proces.Kill();
        }
    }
}

タイマーを使用すると、タスクを実行する頻度をより適切に制御できます。タイマーが実行されていない間は、スレッドは使用されていないため、よりスケーラブルです。Thread.Sleep()スレッドを「待機」に費やす必要があります。これは、バックグラウンドワーカーがキャンセルに応答して、UIがフリーズしたように見える速度に影響を与える可能性があります。

于 2013-03-24T16:25:45.983 に答える
-1

サイクルの最後にThread.Sleep(...)を追加しwhileます。そうすれば、プロセスのチェックの間に少し休止があり、CPU使用率が大幅に低下します。

于 2013-03-24T16:01:05.403 に答える