2017-07-19 43 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