Backgroundworker cpu用法

时间:2013-03-24 15:55:26

标签: c# multithreading backgroundworker cpu cpu-usage

我在我的c#app backgroundworker和dowork无限循环中,但backgroundworker有非常大的CPU使用率(50%)。如何限制后台工作者的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();
                }
            }
        }
    }

5 个答案:

答案 0 :(得分:1)

在循环中,您可以使后台线程等待一段时间,例如

System.Threading.Thread.Sleep(100)

答案 1 :(得分:1)

使用计时器并定期检查这些进程会更容易,不需要在另一个进程中执行此操作。

答案 2 :(得分:0)

根据您的代码,您有几个选择。

我个人会使用Timer类而不是BackgroundWorker,因为没有必要像现在这样每隔几毫秒进行一次检查。

避免使用Thread.Sleep()的另一种方法是使用Thread类,这样您就可以将其优先级设置为最低或低于正常值。

答案 3 :(得分: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显示为冻结。

答案 4 :(得分:-1)

将Thread.Sleep(...)添加到while周期的末尾。这样,检查过程之间会有一些小的停顿,并且CPU使用率会显着下降。