我认为这是一个非常常见的线程场景:
- 我有 100 个相同的工作要完成
- 所有工作都是相互独立的
- 我想一次最多处理 15 个作业
- 随着每个作业的完成,将开始一个新作业,直到所有作业都完成
如果您假设每个作业在完成时都会触发一个事件(我正在使用 BackgroundWorker 类),我可以想出几种方法来解决这个问题,但我不确定“正确”的解决方案是什么。我希望你们中的一些大师能指出我正确的方向。
解决方案 1: 有一段时间(继续){ Threading.Sleep(1000); 在我的 Main( )函数中循环。Job_Completed 事件处理程序中的代码将设置 continue = false 当A)没有待排队的作业和B)所有排队的作业都已完成。我之前使用过这个解决方案,虽然它似乎工作正常......对我来说似乎有点“奇怪”。
解决方案 2: 在我的 Main() 函数中使用 Application.Run()。类似地,Job_Completed 事件处理程序中的代码将调用 Application.Exit() 当A)没有作业要排队和B)所有排队的作业都已完成。
解决方案 3: 使用 ThreadPool,将所有 500-1000 个请求排队,让它们一次运行 10 个(SetMaxThreads)并以某种方式等待它们全部完成。
在所有这些解决方案中,基本思想是每次完成另一个工作时都会启动一个新工作,直到没有工作为止。因此,问题不仅在于等待现有作业完成,还在于等待不再有任何待处理的作业开始。如果 ThreadPool 是正确的解决方案,那么在 ThreadPool 上等待完成所有排队项目的正确方法是什么?
我认为我在这里最重要的困惑是我不完全了解事件是如何从我的 Main() 函数中触发的。显然他们这样做了,我只是从 Windows 消息循环的角度不了解它的机制。解决这个问题的正确方法是什么,为什么?