在c#循环中运行x个线程数

在c#循环中运行x个线程数,c#,C#,在控制台应用程序中,我正在为另一个循环中的每个循环运行并行程序,但是我的一个更新可能需要10分钟,而其余的只需要1秒。这意味着99已完成,但它将等待剩余的1完成,然后再运行下一批 List<Items> myItems = GetItems(); while (myItems.Count > 0) { ParallelOptions options = new ParallelOptions(); options.MaxDegreeOfParallelism = 1

在控制台应用程序中,我正在为另一个循环中的每个循环运行并行程序,但是我的一个更新可能需要10分钟,而其余的只需要1秒。这意味着99已完成,但它将等待剩余的1完成,然后再运行下一批

List<Items> myItems = GetItems();
while (myItems.Count > 0)
{
   ParallelOptions options = new ParallelOptions();
   options.MaxDegreeOfParallelism = 100;
   Parallel.ForEach(myItems, options, item => {
    CallUpdate(item.ID);
   });

   // Get some more records and loop
   myItems = GetItems()
}
List myItems=GetItems();
而(myItems.Count>0)
{
ParallelOptions=新的ParallelOptions();
options.MaxDegreeOfParallelism=100;
Parallel.ForEach(myItems,options,item=>{
更新日期(项目ID);
});
//获取更多记录并循环
myItems=GetItems()
}

有没有更好的方法来做到这一点,以便在某些项目存在时始终可以运行100个线程?

您所描述的非常适合生产者/消费者模式实现。您可以使用


但如果复杂性增加,那么类似的东西可能是更好的选择。下面是一个示例。

外部while循环的作用是什么?GetItems()内部发生了什么?如果任务是IO绑定的,则线程数将超过内核数。如果CPU受限,那么线程数就不会超过内核数。如果让所有线程都处于繁忙状态,为什么还要在意呢?你知道哪个更新需要很长时间吗?如果您这样做了,则单独安排它(可能在非线程池线程上)。您可能还想减少并行性(这样99项工作就可以更轻松地完成——如果您打算等待,就不必着急)。值得一提的是,您可能会发现,您并没有在所有您认为是的线程上完成工作using@MikeJ它只会得到一批尚未处理的项目。因此,它不会一次获得1000万个项目,而是以100个较小的批次完成,这样myItems集合就不会占用大量内存。@feijoc可能最好将其分解到每个步骤并应用适当的解决方案,如果这是I/O绑定的步骤,如等待DB调用,则使用async/Wait,如果是CPU密集型步骤,则并行化。还可以尝试在没有异步或并行处理的情况下找到瓶颈——这可以让我们了解哪些步骤需要更长的时间。