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

我如何展平IReadOnlyCollection,以便将包含的消息用作输入,例如以TransformBlock<OutMsg, SomeOtherType>形式的转换块。是否可以通过LinkTo()

谢谢

最佳答案

您可以使用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);

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

关于c# - TPL数据流: Flatten incoming collection to sequential items,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45190119/

10-13 06:21