具有Blocking Collection的批处理消费者



我在生产者-消费者模式中使用Blocking Collection。为了加快我的程序,我必须批量处理消费者进程:处理阻塞集合中的项目列表(50个项目(,而不是一次处理一个。

因此,我尝试使用queue.Take(50)而不是queue.GetConsumingEnumerable()方法,但没有成功。有没有办法做到这一点,或者我应该重新考虑使用Blocking Collection?

编写queue.Take(50)是在消耗枚举表上使用LINQ Take方法(而不是BlockingCollection Take方法(,因此您最终将获得50个项目,但将它们全部保留在集合中。

如果你只想得到50件物品,你可以使用queue.GetConsumingEnumerable().Take(50),然后你就可以得到50件,并确保它们在你走的时候从收藏中删除。如果您想确保在开始处理任何一个项目之前已经获得了所有50个项目,那么您需要具体化查询(使用ToList或等效工具(。(这可能不会加快处理速度,也可能会减慢处理速度,但这正是您所要求的。(

从.NET 6开始,您可以使用Chunk LINQ运算符:

// Splits the elements of a sequence into chunks of size at most size.
public static IEnumerable<TSource[]> Chunk<TSource> (
    this IEnumerable<TSource> source, int size);

用法示例:

foreach (Item[] chunk in queue.GetConsumingEnumerable().Batch(50))
{
    // Process the chunk that contains 50 items, unless it is the last chunk.
}

最新更新