我有什么,我认为是一个很常见的线程的情景:线程队列傻瓜
- 我有100页相同的作业完成
- 所有作业是相互独立的各个 其他
- 我要处理同时
- 由于每个作业 完成最多的 15的工作,新的工作将开始 ,直到所有的工作已经完成
如果您假设每个作业在他完成时(我使用BackgroundWorker类)都会触发一个事件,我可以想到几种方法来解决这个问题,但我不确定“正确“的解决方案是。我希望你们中的一些专家能指出我的方向。
解决方案1:有一个while(continue){Threading.Sleep(1000);在我的Main()函数中循环}。当Job_Completed事件处理程序中的代码将设置continue = false时A)没有作业剩余排队和B)所有排队的作业已完成。我之前和之后都使用过这个解决方案,看起来工作正常......对我来说似乎有点“奇怪”。
解决方案2:在我的Main()函数中使用Application.Run()。同样,Job_Completed事件处理程序中的代码会在A)没有作业保留排队时,调用Application.Exit(),并且B)所有排队的作业都已完成。解决方案3:使用ThreadPool,排队所有500-1000个请求,让他们一次运行10个(SetMaxThreads),并以某种方式等待它们全部完成。
在所有这些解决方案中,基本思想是每次完成另一项工作时都会开始一项新工作,直到没有剩余工作。所以,问题不仅在于等待现有的工作完成,而且还在等待直到不再有待处理的工作开始。如果ThreadPool是正确的解决方案,那么等待ThreadPool完成所有排队项目的正确方法是什么?
我想我最重要的困惑在于,我不明白HOW事件是否能够从我的Main()函数中触发。显然他们这样做,我只是不明白从Windows消息循环的角度来看它的机制。解决这个问题的正确方法是什么?为什么?
看起来大多数建议都围绕着一个ThreadPool风格的解决方案......我上面提出的解决方案1和解决方案2(基本上等待被正在触发的事件修改的条件)呢?这样做是否有内在的错误,还是仅仅是因为.NET提供了ThreadPool,所以它没有必要? 看起来很奇怪的代码是这样的: while(continue) Threading.Sleep(1000); ...等待事件在Main()函数中触发。在像这样的代码中......当我的事件得到处理时......在Sleep()调用中的某个地方? – 2009-04-28 15:10:55