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)。
根本不要使用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
}
}
我需要每 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)。
根本不要使用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
}
}