【问题标题】:How can I reduce processor usage during an infinite loop in a thread?如何在线程中的无限循环期间减少处理器使用率?
【发布时间】:2011-12-29 03:31:04
【问题描述】:

我创建了一个新线程。这是一个线程方法代码:

while (true)
{
    if (!showHelp)
    {
        Console.Clear();
        Console.WriteLine("==============================================");
        Console.WriteLine(player.PlayList.CurrentTrack().Artist + " "
                          + player.PlayList.CurrentTrack().Title + " "
                          + player.PlayList.CurrentTrack().Genre.ToString());
        Console.WriteLine(" [ " + pos.Duration() + " / "
                          + player.PlayList.CurrentTrack().Length + " ] ");
        Console.WriteLine("===============================================");
    }

    Thread.Sleep(1000);

    if (isPlaying)
        pos += TimeSpan.FromSeconds(1);

    if (pos > player.PlayList.CurrentTrack().Length)
    {
        pos = TimeSpan.Zero;
        player.Next();
    }
}

我想更改控制台中的当前曲目位置。每次迭代我都会睡 1 秒,并在位置上增加 1 秒。

我在无限循环中执行此操作,我的处理器似乎低于 50% 的负载。

我应该怎么做才能减少循环迭代之间处理器上的负载?

【问题讨论】:

  • 如果有 Thread.Sleep 不应该拿 50% 吗?您确定是 this 线程占用了所有 CPU 时间吗?
  • 你确定你只有 1 个线程吗?
  • 卸载处理器是什么意思? (也许您可以编辑您的问题并重新表述)
  • thread.sleep 通常不是一个好的设计。见these comments
  • 还应该注意的是,Sleep 睡眠时间至少您设置的时间。当Sleep 需要超过一秒的时间才能返回时,您现在的操作方式可以让pos 与实时不同步。

标签: c# .net multithreading optimization cpu-usage


【解决方案1】:

CPU 负载似乎更有可能是由于正在播放的媒体而不是此代码。

您有双核或超线程 CPU 吗?在这种情况下,50%(例如在 Perfmon 中)对应于一个 CPU 完全在使用中 - 这可能是媒体播放器 - 这意味着您的代码(基本上)处于空闲状态。这就是您一次只睡 1 秒时所期望的结果——这在 CPU 方面是永恒的。

媒体播放是一个占用大量 CPU 资源的过程,除了点击“停止”或“暂停”之外,您无能为力。

【讨论】:

  • 您可以从 PerfMon 获取线程级 CPU 数据来证实这一假设。查看处于此状态时进程中线程的线程 ID 和 CPU,并与您在调试器中看到的线程 ID 相关联(或将线程 ID 添加到上面的日志输出中,并为媒体播放制作类似的线程 ID 输出线程)。
【解决方案2】:

为什么不使用Timer 来更新当前位置并使用Stopwatch 或只是普通的DateTime 来测量经过的时间。

这样一来你就没有无限循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2019-09-27
    • 2021-12-11
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多