我正在使用TPL数据流构建应用程序。其实我有以下问题。我有一个transformblock var tfb1 = new TranformBlock<InMsg, IReadOnlyCollection<OutMsg>>
。所以tfb1
收到消息并创建一个消息列表。此消息列表应链接到路由器数据块,该数据块接收OutMsg
作为输入(而不是IReadOnlyCollection<OutMsg>
)。
如何展平IReadOnlyCollection
以便包含的消息可用作例如{}的输入。 TransformBlock<OutMsg, SomeOtherType>
形式的变换块。可以通过LinkTo()
吗?
THX
答案 0 :(得分:3)
您可以使用TransformManyBlock
代替TransformMany
来压缩任何IEnumerable<T>
结果,例如:
var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
List<OutMsg> myResultList;
//Calculate some results
return myResultList;
});
这会将各个OutMsg实例传递给下一个块。
您可以使用迭代器,以便立即传播单个消息:
var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
//Calculate some results
foreach(var item in someDbResults)
{
yield return item;
}
});
或者你可以简化输入:
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);
与任何谓词不匹配的消息将卡在输出缓冲区中并阻止块完成。通过一个没有谓词的链接,您可以确保处理所有消息