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

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

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

避免使用的另一种替代方法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 回答