Backgroundworker 和 CPU 用法

Backgroundworker and CPU usage

我需要每 20 秒做一些后台工作(不必正好是 20000 毫秒,我可以允许延迟)。 我正在使用一个执行函数的 Backgroundworker,然后使用计时器再等待 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,只要停用 Backgroundworker,CPU 使用率就会下降到 0.5%。

如何在不使 CPU 超载的情况下完成相同的工作?

CPU被这个循环吃掉了:

while (keepWorkerRunning);

您有效地指示 CPU 尽可能快地循环 "doing nothing"。因此 70% CPU 负载,它可能更糟(高达 100% 取决于您的 CPU/cores)。

根本不要使用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
  }
}