BlockingCollection <T>使用TPL DataFlow进行批处理

The*_*ger 5 c# task-parallel-library blockingcollection

有没有办法批量阻止集合中的项集合.例如

我有一个消息传递总线发布者调用blockingCollection.Add()

还有一个像这样创建的消费线程:

Task.Factory.StartNew(() =>
        {
            foreach (string value in blockingCollection.GetConsumingEnumerable())
                {
                    Console.WriteLine(value);
                }
        });
Run Code Online (Sandbox Code Playgroud)

但是,我只希望控制台在阻塞集合上有10个项目后写入,而GetConsumingEnumerable()总是在每个项目添加后触发.我可以为此编写自己的队列但是如果可能的话我想使用阻塞集合吗?

Dim*_*tri 4

不确定项目要求是什么,但我推荐TPL DataFlow BatchBlock

您可以实例化 a BatchBlock<string>,将其绑定到 anActionBlock<string>然后发布到批处理块。

伪代码可能如下所示:

var bb = new BatchBlock<string>(10);
var ab = new ActionBlock<string[]>(msgArray=>{ 
    foreach(var msg in msgArray) 
        Console.Writeline(msg);
});

bb.LinkTo(ab);

foreach (string value in blockingCollection.GetConsumingEnumerable())
{
      bb.Post(value);
}
Run Code Online (Sandbox Code Playgroud)

使用 DataFlow,您甚至可能想用 BufferBlock 替换 BlockingCollection,或者直接发布到缓冲区块,而不先添加到阻塞集合,因为批处理块已经是线程安全的。