【问题标题】:Performance problem with backgroundworkers后台工作人员的性能问题
【发布时间】:2011-01-13 11:39:42
【问题描述】:

我有 15 个一直在运行的 BackgroundWorer,每个都工作大约半秒(发出 Web 请求)并且它们都没有停止过。

我注意到我的程序占用了我计算机大约 80% 的处理资源和大约 15mb 的内存(core 2 duo,4gb ddr2 memory)。

正常吗? Web 请求并不繁重,它只是发送并等待服务器响应,是的,运行其中的 15 个确实不是一个有利于性能的行为(需要速度),但我不认为它会如此紧张。

我是编程新手,我几乎从来没有(就像我认为的任何新程序员一样)关心性能,但这次很荒谬,80% 的处理资源使用用于具有两个列表框和后台工作程序的 Windows 窗体应用程序发出网络请求并不符合预期。

信息:

  • 我在日常工作中使用异常处理,我曾经读过这对性能并不好
  • 我有 15 个后台工作人员
  • 我的代码确保它们都不会闲置
  • 列表项
  • windows 窗体、visual studio、c#。

-----[编辑 - 答案中的问题]------

“我的代码确保它们都不会闲置”到底是什么意思?
程序仍在等待

while (bgw1.IsBusy || gbw2.IsBusy ... ... ...) { Application.DoWork();}

然后当他们中的任何一个有空时,就会重新开始工作。

您能否详细说明您为此承担的工作量?
我创建了一个 HTTP Web 请求对象,打开它并等待服务器请求。它真的只有几行,没有繁重的处理,半秒是由于服务器等待。

以什么方式,有多少异常被抛出? 当页面不存在时,有一个 system.WebException,当它工作时它返回“OK”,并且我检查的大约 99% 的页面不存在,所以我会说每分钟大约 300 个异常(放置我知道,这样听起来让人毛骨悚然,但它确实有效)

如果您在调试器中运行,那么异常会比不调试时的代价高得多 我不是在谈论在调试器中运行它,我运行的是可执行文件,即生成的 EXE。

【问题讨论】:

    标签: visual-studio winforms performance multithreading backgroundworker


    【解决方案1】:
    while (bgw1.IsBusy || gbw2.IsBusy ... ... ...) { Application.DoWork();}
    

    Application.DoWork(); 在做什么?如果它快速地做某事并返回,那么仅此循环就会消耗 100% 的 CPU,因为它永远不会停止做某事。您可以在循环中放置一个 sleep(.1) 左右,以便每隔一段时间而不是连续检查工作线程。

    【讨论】:

    • 我做到了,但它不允许 bgw 将其 IsBusy 标志更改为 false .. 即使使用 Application.DoWork();在循环内。
    【解决方案2】:

    这点与我有关:

    我的代码确保它们都不会闲置

    你到底是什么意思?

    如果您发出成千上万个 Web 请求,并且这些请求返回的速度非常快,那么 可能会占用一些 CPU。

    占用 15MB 内存并不意外,但 CPU 更令人担忧。您能否详细说明您所承担的工作量? “他们每个人工作大约半秒”是什么意思?

    “我在日常工作中使用异常处理”是什么意思?以什么方式,有多少异常被抛出?如果您在调试器中运行,那么异常比不调试时要昂贵得多 - 如果您抛出并捕获大量异常,可能对此负责。 .

    【讨论】:

      【解决方案3】:

      在调试器中运行程序,暂停十次,然后查看堆栈跟踪。然后,您将知道忙碌时实际在做什么。

      【讨论】:

        【解决方案4】:

        从您的文字中,我了解到您拥有 Core 2 Duo。是 2 线程还是 4 线程?

        如果您有 2 个线程,则只能同时使用 2 个BackGroundworkers。 如果您有 4 个线程,则同时使用 4 个BGW's。如果您有更多BGW's,请经常使用以下语句:

        System.Threading.Thread.Sleep(1) 
        

        也可以使用Applications.DOevents

        我的一般建议是:从简单开始,慢慢让您的应用程序变得更复杂。
        看看:Visual Basic 2010 Parallel Programming techniques.

        【讨论】:

          猜你喜欢
          • 2015-12-07
          • 1970-01-01
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多