Backgroundworker和CPU使用率

时间:2015-07-22 10:52:15

标签: c# wpf backgroundworker system.timers.timer

我需要每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的情况下完成相同的工作?

1 个答案:

答案 0 :(得分:2)

这个循环吃了CPU:

while (keepWorkerRunning);

您有效地指示CPU尽可能快地循环“无所事事”。因此,70%的CPU负载可能更糟(根据您的CPU /内核,最高可达100%)。

根本不要使用BackgroundWorkerElapsed事件由线程池线程上的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
  }
}