后台工作线程的cpu使用率

本文关键字:cpu 使用率 线程 工作 后台 | 更新日期: 2023-09-27 18:05:38

我有在我的c#应用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();
                }
            }
        }
    }

后台工作线程的cpu使用率

使用计时器并定期检查这些进程会更容易,而不需要在另一个线程中这样做。

在循环中,你可以让后台线程等待一定的时间,例如

System.Threading.Thread.Sleep(100)

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

我个人会使用Timer类而不是BackgroundWorker,因为它不需要像你现在这样每隔几毫秒检查一次。

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

使用计时器:
    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(),你必须投入一个线程来"等待"——这可能会影响后台worker对取消的响应速度,并使你的UI看起来冻结。

将Thread.Sleep(…)添加到while循环的末尾。这样,在检查进程之间会有一段小的停顿,cpu使用率会显著下降。