BatchedJoinBlockT1 T2 ......

(从 2-3 个输入中收集一定数量的总项目,并将它们分组为数据项集合的元组)

BatchedJoinBlock <T1,T2,…>在某种意义上是 BatchBlock 和 JoinBlock <T1,T2,…>的组合。
而 JoinBlock <T1,T2,…>用于将每个目标的一个输入聚合成一个元组,而 BatchBlock 用于将 N 个输入聚合到一个集合中,BatchedJoinBlock <T1,T2,…>用于收集来自两个的 N 个输入所有目标都进入了集合的元组。

StackOverflow 文档

分散/集中

考虑一个分散/聚集问题,其中 N 个操作被启动,其中一些可能成功并产生字符串输出,而其他操作可能会失败并产生异常。

var batchedJoin = new BatchedJoinBlock<string, Exception>(10);

for (int i=0; i<10; i++)
{
    Task.Factory.StartNew(() => {
        try { batchedJoin.Target1.Post(DoWork()); }
        catch(Exception ex) { batchJoin.Target2.Post(ex); }
    });
}

var results = await batchedJoin.ReceiveAsync();

foreach(string s in results.Item1) 
{
    Console.WriteLine(s);
}

foreach(Exception e in results.Item2) 
{
    Console.WriteLine(e);
}

Stephen Toub 介绍 TPL 数据流