Backgroundworker睡眠减少CPU

时间:2011-11-27 03:16:53

标签: c# backgroundworker sleep

我有一项任务,我想反复运行。我想尽可能快地调用它,但是我想保持我的cpu周期较低。我在后台工作中使用Sleep阅读并不是最佳选择。然而,没有睡眠,我的CPU保持在55%左右。我在下面有一个我的源代码示例。如果睡眠合适,你如何选择最佳睡眠时间,正如你从下面的结果中看到的那样,根据我的睡眠时间长短得到不同的结果。做某事的人可以让我知道最佳做法是什么

BackgroundWorker _Worker = new BackgroundWorker()
{
  WorkerReportsProgress = true,
  WorkerSupportsCancellation = true
};

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    // do my task here

    // if i uncomment one of the Sleep below I reduce the CPU like so
    // no sleep             CPU = 52-58%
    // Thread.Sleep(1);     CPU = 09-15%
    // Thread.Sleep(10);    CPU = 02-03%
    // Thread.Sleep(100);   CPU = 00-01%
}

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled) { return; }

    _Worker.RunWorkerAsync();
}

3 个答案:

答案 0 :(得分:1)

对于多线程,当您不想使用机器时,通常会将后台工作设置为较低的优先级。它将使用剩余的CPU。这意味着你不应该关心它是否达到100%。

但是,BackgroundWorker的问题是您无法设置优先级。

另一个选择是产生你自己的线程,你可以设置优先级。

这是另一篇相关的SO帖子:

.NET Backgroundworker Object's Thread Priority

另外,另一个(可能吸引力较小)选项是将繁重的工作放入另一个进程并使该优先级低的运行。如果您不需要传达很多进展,那很简单。否则,打开通信渠道会更复杂。

How do I launch a process with low priority? C#

答案 1 :(得分:1)

在大多数情况下,确定性睡眠不是最佳优化(在您的情况下它只是一个随机数,而不是您可以进行的完美优化),rather wait and signal是最佳选择。您现在可以尝试降低线程优先级,但我强烈建议使用等待和信号范例获得最佳性能

答案 2 :(得分:0)

将后台线程设置为较低优先级将确保您的处理不会干扰其他功能(只需给予它足够低的优先级)。但是,这是一个解决方案吗?您希望后台工作持续运行。也许慢慢跑对你来说不是一个好选择?

你真的想要实现什么?