与backgroundworkers的性能问题

时间:2010-02-05 11:18:39

标签: visual-studio winforms performance multithreading backgroundworker

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

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

这很正常吗?网络请求不是重要的,它只是发送并等待服务器响应,是的,运行其中的15个实际上不是一个支持性能的行为(需要速度)但我不认为它会如此激烈。

我是编程新手,我几乎没有(正如任何新的程序员,我认为)关心性能,但这次是荒谬的,80%的处理资源用于带有两个列表框和后台工作者的Windows窗体应用程序提出网络请求并不是预期的。

信息:

  • 我使用异常处理作为我日常工作的一部分,我曾经读过它对性能不是很好
  • 我有15名背景工作者
  • 我的代码确保它们都没有闲置
  • 列表项
  • Windows窗体,visual studio,c#。

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

你的意思是什么?“我的代码确保他们都没有闲置”?
该计划仍在等待

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

然后当他们中的任何一个是免费的时候,就会重新开始工作。

您能否详细介绍一下您所承担的工作量?
我创建一个HTTP Web请求对象,打开它并等待服务器请求。它实际上只有几行并没有繁重的处理,半秒是由于服务器等待。

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

如果你在调试器中运行,那么异常比不调试时要贵得多 我不是在讨论在调试器中运行它,我运行可执行文件,结果是EXE。

4 个答案:

答案 0 :(得分:2)

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

Application.DoWork();在做什么?如果它快速做某事并返回,那么这个循环将消耗100%的CPU,因为它永远不会停止做某事。你可以在循环中放置sleep(.1)左右,只是经常检查工作线程而不是连续检查。

答案 1 :(得分:1)

这一点让我担心:

  

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

你到底是什么意思?

如果您正在制作成千上万的网络请求,并且这些请求很快就会返回,那么可以吃掉一些CPU。

占用15MB的内存并不出人意料,但CPU更令人担忧。你能否详细介绍一下你的工作量? “你们每个人工作半秒钟”是什么意思?

“我将异常处理作为常规的一部分”是什么意思?以什么方式,以及抛出了多少例外?如果你在调试器中运行,那么异常比不调试时要贵得多 - 如果你抛出并捕获了很多异常,那么可以负责它。

答案 2 :(得分:0)

在调试器中运行程序,暂停十次,然后查看堆栈跟踪。那么当你忙的时候你会知道它到底在做什么。

答案 3 :(得分:0)

从你的文字中我读到你有一个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