【问题标题】:CPU is 99% when write a threading application编写线程应用程序时 CPU 为 99%
【发布时间】:2011-01-01 11:41:07
【问题描述】:

我创建了一个 Windows 应用程序 C#,就像一个下载管理器 当运行这个应用程序时,我发现 CPU 是 99%,我写了一个线程 应用程序我如何开始解决这个问题

谢谢

【问题讨论】:

  • 您需要告诉我们您在做什么才能获得帮助。 Stack Overflow 上的专家很棒,但他们不会读心术。
  • @David - 我相信 Nick Craver 确实会读心术,但他似乎还没有出现。
  • 首先查看任务管理器。真的是你的应用程序在吃 CPU 吗?如果是,则尝试在您的应用程序中添加一些日志记录语句,以查看哪个部分卡在循环中。尝试隔离有问题的应用程序部分,然后您就可以解决它。
  • 所以你编写了代码来启动一堆线程,现在你发现它们正在运行。这不是问题,它正在工作。如果您不喜欢它们拖慢用户界面的速度,请降低它们的优先级。
  • 您为什么认为这是个问题? 相反的将是一个问题!如果多线程应用程序中的 CPU 利用率低于 100%,则 您有未安排工作的线程。多线程的整个是保持CPU运行,以便在后台尽可能快地完成工作。你能解释一下为什么你认为使用你的 CPU 是个问题吗?

标签: c# windows multithreading cpu-usage


【解决方案1】:

寻找代码中的任何紧密循环 - 几乎可以肯定是其中之一。像这样的:

while (!finished)
{
    progressBar.Value = DownloadProgress;
}

虽然没有看到您的代码,但很难猜得比这更准确。

【讨论】:

    【解决方案2】:

    我建议您首先分析您的应用程序以识别热点,然后重新编写代码以消除热点。分析您的应用程序 - 活动线程数 - 不同线程消耗的 CPU,分析函数以捕获任何 CPU 繁重的函数。

    【讨论】:

    • 我用的是进度条,我是进度条有问题
    • 我在假设性能瓶颈时经常出错;这就是为什么使用分析器也如此重要的原因。
    【解决方案3】:

    是的,分析是个好主意。使用例如红门ANTS Performance Profiler免费测试14天。

    【讨论】:

      【解决方案4】:

      这是我最喜欢线程的地方,我想你找不到更简单的线程策略文章了。

      http://www.albahari.com/threading/

      【讨论】:

        【解决方案5】:

        我会尝试 Jons 的答案,然后实施 Muek 的答案。

        您的代码中某处有紧密的循环。尽管优先级较低(如果您使用它) - 如果您有一个不会将控制权释放回内核线程调度程序的循环,它将消耗所有 CPU,直到从中获得控制权。例如,您可以:

        while (!_shouldStop)
        {
            DoProcessing();
        }
        

        这真的IS很糟糕,因为它肯定会占用你所有的 CPU。

        要解决这个问题,最简单的方法是在循环中使用 Sleep(100) 或 Sleep(0),例如:

        while (!_shouldStop)
        {
            DoProcessing();
            Thread.Sleep(0);
        }
        

        还有更好的(并且在某种程度上更复杂的方法)可以做到这一点 - 例如事件 - 但首先,你的应用会在这里表现得更好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多