2017-07-19 151 views
3

我正在使用TPL數據流構建應用程序。其實我有以下問題。我有一個transformblock var tfb1 = new TranformBlock<InMsg, IReadOnlyCollection<OutMsg>>。因此,tfb1在消息中接收並創建出站消息列表。這個out-messages列表應該鏈接到一個路由器數據塊,它接收OutMsg作爲輸入(而不是IReadOnlyCollection<OutMsg>)。TPL數據流:將收到的收集整合到sequentiel項目

如何將IReadOnlyCollection弄平,以便包含的消息可用作例如一個TransformBlock<OutMsg, SomeOtherType>形式的變換塊。是否可以通過LinkTo()

THX

+0

您是否嘗試過TransformManyBlock? –

+0

我以爲TransformMany是一個1到n的關係。所以1條消息創建了一組消息。 – Moerwald

+0

這不是你想要在這裏做嗎?生成多個OutMsg對象並將它們傳遞給路由器塊? –

回答

2

可以使用的,而不是TransformManyBlockTransformMany任何壓扁IEnumerable<T>結果,例如:

var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{ 
    List<OutMsg> myResultList; 
    //Calculate some results 
    return myResultList; 
}); 

這將個人OutMsg情況下傳遞給下一個塊。

您可以使用一個迭代器等等各個消息immediatelly傳播:

或者,你可以拼合輸入:

var flattenBlock = new TransformManyBlock<IEnumerable<OutMsg>,OutMsg>(items=>items); 

您可以將此塊鏈接到接受OutMsg任何塊:

var block = new ActionBlock<OutMsg>(...); 

flattenBlock.LinkTo(block); 

您可以路線通過將謂詞傳遞給LinkTo。例如,如果您要路由失敗消息的日誌程序塊,你可以輸入:

flattenBlock.LinkTo(logBlock,msg=>msg.HasError); 
flattenBlock.LinkTo(happyBlock); 

消息不匹配任何斷言會卡在輸出緩衝區,防止塊無法完成。通過一個沒有謂詞的鏈接,確保所有消息都將被處理

+0

嗯......但上面的代碼會生成輸入消息中的輸出消息列表。我會需要相反的操作。 – Moerwald

+0

您發佈了要將* listten *列表並將單個消息發送到路由器塊的內容。順便說一句,你可以在'LinkTo()'上指定一個謂詞,你不需要一個塊來路由消息 –

+0

正確。 Thx很多爲您更新的答案,我會嘗試您的建議。 – Moerwald