我认为这是一个非常常见的线程场景:
- 我有 100 份相同的工作需要完成
- 所有工作都是独立的
其他
- 我想最多处理
一次 15 个职位
- 正如每一份工作
完成后,将开始新的工作
直到所有作业完成
如果您假设每个作业完成时都会触发一个事件(我使用的是BackgroundWorker 类),我可以想出几种方法来实现这一点,但我不确定“正确”的解决方案是什么。我希望你们中的一些专家能给我指出正确的方向。
解决方案1:有一个while(继续) { Threading.Sleep(1000); }在我的 Main() 函数中循环。 Job_Completed 事件处理程序中的代码将在以下情况下设置 continue = falseA)没有作业需要排队并且B)所有排队的作业均已完成。我以前使用过这个解决方案,虽然它似乎工作正常......对我来说似乎有点“奇怪”。
解决方案2:在我的 Main() 函数中使用 Application.Run() 。同样,Job_Completed 事件处理程序中的代码将在以下情况下调用 Application.Exit()A)没有作业需要排队并且B)所有排队的作业均已完成。
解决方案3:使用线程池,将所有 500-1000 个请求排队,让它们一次运行 10 个 (SetMaxThreads),并以某种方式等待它们全部完成。
在所有这些解决方案中,基本思想是每次完成另一个作业时都会开始一个新作业,直到没有剩余作业为止。因此,问题不仅在于等待现有作业完成,还在于等待直到不再有任何挂起的作业可以启动。如果 ThreadPool 是正确的解决方案,那么等待 ThreadPool 完成所有排队项目的正确方法是什么?
我认为我最困惑的是我不明白事件是如何从我的 Main() 函数中触发的。显然他们是这样做的,我只是从 Windows 消息循环的角度不理解它的机制。解决这个问题的正确方法是什么,为什么?
即使其他答案很好,如果您想要另一个选择(您永远不会有足够的选择),那么作为一个想法怎么样?
只需将每个作业的数据放入一个结构中,该结构位于 FIFO 堆栈中。
创建 15 个线程。
每个线程将从堆栈中获取下一个作业,并将其弹出。
当一个线程完成处理时,获取下一个作业,如果堆栈为空,则线程死亡或只是休眠,等待。
唯一的复杂性(解决起来非常简单)是在关键部分进行弹出(同步读取/弹出)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)