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 資料流