BlockingCollection<T> batching using TPL DataFlow
blockingcollection, c#, task-parallel-library
Solution
Not sure what the project requirements are but I'd recommend TPL DataFlow BatchBlock.
You would instantiate a `BatchBlock<string>`, bind it to an `ActionBlock<string>` and then post to the batch block.
A pseudo code might look something like this:
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);
}
Using DataFlow you might even want to replace the BlockingCollection with a BufferBlock or just post to the buffer block directly without first adding to the blocking collection, since batch block is already thread-safe.
Problem
Is there a way to batch a collection of items from the blocking collection. E.G. I have a messaging bus publisher calling blockingCollection.Add() And a consuming thread which is created like this: ``` Task.Factory.StartNew(() => { foreach (string value in blockingCollection.GetConsumingEnumerable()) { Console.WriteLine(value); } }); ``` However, I only want the Console to write after the blocking collection has 10 items on it, whereas GetConsumingEnumerable() always fires after each item is added. I could write my own queue for this but I'd like to use the blocking collection if possible?