我需要每20秒做一些后台工作(它不必完全是20000毫秒,我可以允许延迟)。 我正在使用执行该功能的Backgroundworker,然后使用Timer再等待20秒:
private readonly BackgroundWorker Worker = new BackgroundWorker();
volatile bool keepWorkerRunning;
Worker.DoWork += Worker_DoWork;
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 20000;
aTimer.Enabled = true;
keepWorkerRunning = true;
while (keepWorkerRunning) ;
aTimer.Enabled = false;
}
该工作程序在软件运行时始终处于活动状态。
问题是它占用了大部分CPU。我注意到我的软件一直在使用大约70%的CPU,而只是停用后台工作程序,CPU使用率下降到0.5%。
如何在不超载CPU的情况下完成相同的工作?
答案 0 :(得分:2)
这个循环吃了CPU:
while (keepWorkerRunning);
您有效地指示CPU尽可能快地循环“无所事事”。因此,70%的CPU负载可能更糟(根据您的CPU /内核,最高可达100%)。
根本不要使用BackgroundWorker
。 Elapsed
事件由线程池线程上的Timer
引发(计时器的SynchronizingObject
属性应为 null ),因此它将在后台运行
您可以获得更多信息here。
<强>更新强> 根据要求,这是一个样本。
using System.Timers;
class MyClass : IDisposable
{
readonly Timer aTimer = new Timer(20000);
public void StartTimer()
{
this.aTimer.Elapsed += this.OnTimedEvent;
this.aTimer.Enabled = true;
}
void OnTimedEvent(object source, ElapsedEventArgs e)
{
// do your background work here
}
}