0

我需要每 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,而只是停用 Backgroundworker,CPU 使用率下降到 0.5%。

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

4

1 回答 1

2

CPU被这个循环吃掉了:

while (keepWorkerRunning);

您有效地指示 CPU 尽可能快地循环“什么都不做”。因此 70% 的 CPU 负载,可能会更糟(高达 100%,具体取决于您的 CPU/内核)。

根本不要使用BackgroundWorker。该Elapsed事件由Timer线程池线程(SynchronizingObject计时器的属性应为null)引发,因此它将在后台运行。

更多信息,您可以在这里获得。


更新: 根据要求,这是一个示例。

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
  }
}
于 2015-07-22T11:03:04.083 回答