【问题标题】:Backgroundworker Sleep to reduce CPUBackgroundworker Sleep 以减少 CPU
【发布时间】:2011-11-27 03:16:52
【问题描述】:

我有一个任务,我想一遍又一遍地运行。我想尽可能快地调用它,但是我想保持我的 cpu 周期低。我读过在后台工作人员中使用睡眠不是最佳选择。然而,如果没有睡眠,我的 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();
}

【问题讨论】:

  • 根据您的使用方式,也许 Timer 会更合适。
  • 我考虑过计时器,但我的任务需要 5 秒到 5 分钟才能完成,所以我认为后台工作人员会是更好的选择。
  • 您为什么关心 CPU 百分比?如果您想确保系统的其余部分保持响应,也许将其放在优先级较低的线程上会更合适。
  • 根据您的应用程序,可以选择在有工作要做时使用信号量向工作线程发出信号,或者在没有工作时阻止它们......

标签: c# backgroundworker sleep


【解决方案1】:

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

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

另一种选择是生成您自己的线程,您可以设置优先级。

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

.NET Backgroundworker Object's Thread Priority

另外,另一个(可能不太吸引人)的选择是将繁重的工作放到另一个进程中,并使其运行优先级较低。如果你不需要交流很多进展,这很简单。否则打开沟通渠道会比较复杂。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      真正想要达到什么目的?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2019-02-14
        • 2015-04-19
        • 2013-06-01
        • 1970-01-01
        • 2010-09-06
        • 2015-08-02
        相关资源
        最近更新 更多