JoinBlockT1 T2 ......
(收集 2-3 個輸入並將它們組合成一個元組)
與 BatchBlock 一樣,JoinBlock <T1,T2,…>能夠對來自多個資料來源的資料進行分組。事實上,這是 JoinBlock <T1,T2,…>的主要目的。
例如,JoinBlock <string,double,int>是一個 ISourceBlock <Tuple <string,double,int >>。
與 BatchBlock 一樣,JoinBlock <T1,T2,…>能夠在貪婪和非貪婪模式下執行。
- 在預設貪婪模式下,即使另一個目標沒有用於形成元組的必要資料,也會接受提供給目標的所有資料。
- 在非貪婪模式下,塊的目標將推遲資料,直到所有目標都被提供必要的資料來建立元組,此時塊將參與兩階段提交協議,以原子方式從源中檢索所有必需的專案。這種推遲使得另一個實體可以在此期間消費資料,從而允許整個系統前進。
使用有限數量的池物件處理請求
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);