我有15个一直在运行的BackgroundWorers,每个都运行大约半秒钟(发出Web请求)并且它们都没有被停止。
我注意到我的程序占用了计算机处理资源的80%左右和大约15mb的内存(core 2 duo,4gb ddr2内存)。
这很正常吗?网络请求不是重要的,它只是发送并等待服务器响应,是的,运行其中的15个实际上不是一个支持性能的行为(需要速度)但我不认为它会如此激烈。
我是编程新手,我几乎没有(正如任何新的程序员,我认为)关心性能,但这次是荒谬的,80%的处理资源用于带有两个列表框和后台工作者的Windows窗体应用程序提出网络请求并不是预期的。
信息:
------ [编辑 - 答案中的问题] ------
你的意思是什么?“我的代码确保他们都没有闲置”?
该计划仍在等待
while (bgw1.IsBusy || gbw2.IsBusy ... ... ...) { Application.DoWork();}
然后当他们中的任何一个是免费的时候,就会重新开始工作。
您能否详细介绍一下您所承担的工作量?
我创建一个HTTP Web请求对象,打开它并等待服务器请求。它实际上只有几行并没有繁重的处理,半秒是由于服务器等待。
以什么方式,以及抛出多少例外? 当页面不存在时,有一个system.WebException,当它工作时返回“OK”,我检查的大约99%的页面都不存在,所以我说每分钟大约有300个异常(put)它就像这样让它听起来令人毛骨悚然,我知道,但它确实有效)
如果你在调试器中运行,那么异常比不调试时要贵得多 我不是在讨论在调试器中运行它,我运行可执行文件,结果是EXE。
答案 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。