我在我的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();
}
}
}
}
答案 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使用率会显着下降。