TPL数据流:将传入的集合展平为sequentiel项目
我正在使用TPL数据流构建应用程序。 其实我有以下问题。 我有一个transformblock var tfb1 = new TranformBlock<InMsg, IReadOnlyCollection>
。 因此tfb1
接收消息并创建消息列表。 这个out-messages列表应链接到路由器数据块,它接收OutMsg
作为输入(而不是IReadOnlyCollection
)。
我如TransformBlock
IReadOnlyCollection
以便包含的消息可以用作例如TransformBlock
forms的变换块的输入。 是否可以通过LinkTo()
?
谢谢
您可以使用TransformManyBlock
而不是TransformMany
来展平任何IEnumerable
结果,例如:
var flattenBlock = new TransformManyBlock(msg=>{ List myResultList; //Calculate some results return myResultList; });
这会将各个OutMsg实例传递给下一个块。
您可以使用迭代器,以便立即传播单个消息:
var flattenBlock = new TransformManyBlock(msg=>{ //Calculate some results foreach(var item in someDbResults) { yield return item; } });
或者你可以简化输入:
var flattenBlock = new TransformManyBlock,OutMsg>(items=>items);
您可以将此块链接到任何接受OutMsg的块:
var block = new ActionBlock(...); flattenBlock.LinkTo(block);
您可以通过将谓词传递给LinkTo
来路由消息。 例如,如果要将故障消息路由到日志记录块,可以键入:
flattenBlock.LinkTo(logBlock,msg=>msg.HasError); flattenBlock.LinkTo(happyBlock);
与任何谓词不匹配的消息将卡在输出缓冲区中并阻止块完成。 通过一个没有谓词的链接,您可以确保处理所有消息