TPL数据流:将传入的集合展平为sequentiel项目

我正在使用TPL数据流构建应用程序。 其实我有以下问题。 我有一个transformblock var tfb1 = new TranformBlock<InMsg, IReadOnlyCollection> 。 因此tfb1接收消息并创建消息列表。 这个out-messages列表应链接到路由器数据块,它接收OutMsg作为输入(而不是IReadOnlyCollection )。

我如TransformBlock IReadOnlyCollection以便包含的消息可以用作例如TransformBlockforms的变换块的输入。 是否可以通过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); 

与任何谓词不匹配的消息将卡在输出缓冲区中并阻止块完成。 通过一个没有谓词的链接,您可以确保处理所有消息