JoinBlockT1 T2 ......

(收集 2-3 个输入并将它们组合成一个元组)

与 BatchBlock 一样,JoinBlock <T1,T2,…>能够对来自多个数据源的数据进行分组。事实上,这是 JoinBlock <T1,T2,…>的主要目的。

例如,JoinBlock <string,double,int>是一个 ISourceBlock <Tuple <string,double,int >>。

与 BatchBlock 一样,JoinBlock <T1,T2,…>能够在贪婪和非贪婪模式下运行。

  • 在默认贪婪模式下,即使另一个目标没有用于形成元组的必要数据,也会接受提供给目标的所有数据。
  • 在非贪婪模式下,块的目标将推迟数据,直到所有目标都被提供必要的数据来创建元组,此时块将参与两阶段提交协议,以原子方式从源中检索所有必需的项目。这种推迟使得另一个实体可以在此期间消费数据,从而允许整个系统前进。

StackOverflow 文档

使用有限数量的池对象处理请求

var throttle = new JoinBlock<ExpensiveObject, Request>();
for(int i=0; i<10; i++) 
{
    requestProcessor.Target1.Post(new ExpensiveObject()); 
}

var processor = new Transform<Tuple<ExpensiveObject, Request>, ExpensiveObject>(pair =>
{
    var resource = pair.Item1;
    var request = pair.Item2;
    
    request.ProcessWith(resource);
    
    return resource;
});

throttle.LinkTo(processor);
processor.LinkTo(throttle.Target1);

Stephen Toub 介绍 TPL 数据流