后台工作线程的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();
}
}
}
}
使用计时器并定期检查这些进程会更容易,而不需要在另一个线程中这样做。
在循环中,你可以让后台线程等待一定的时间,例如
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使用率会显著下降。