TPL 数据流:将传入集合展平为顺序项目

Moe*_*ald 6 c# tpl-dataflow

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

我怎样才能展平IReadOnlyCollection以便包含的消息可以用作输入,例如TransformBlock<OutMsg, SomeOtherType>. 可以通过LinkTo()吗?

谢谢

Pan*_*vos 7

您可以使用TransformManyBlock代替TransformMany来展平任何IEnumerable<T>结果,例如:

var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
    List<OutMsg> myResultList;
    //Calculate some results
    return myResultList;
});
Run Code Online (Sandbox Code Playgroud)

这会将单个 OutMsg 实例传递给下一个块。

您可以使用迭代器,以便立即传播各个消息:

  var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
    //Calculate some results
    foreach(var item in someDbResults)
    {
        yield return item;
    }
});
Run Code Online (Sandbox Code Playgroud)

或者您可以将输入展平:

var flattenBlock = new TransformManyBlock<IEnumerable<OutMsg>,OutMsg>(items=>items);
Run Code Online (Sandbox Code Playgroud)

您可以将此块链接到任何接受 OutMsg 的块:

var block = new ActionBlock<OutMsg>(...);

flattenBlock.LinkTo(block);
Run Code Online (Sandbox Code Playgroud)

您可以通过将谓词传递给来路由消息LinkTo。例如,如果要将失败消息路由到日志记录块,可以键入:

flattenBlock.LinkTo(logBlock,msg=>msg.HasError);
flattenBlock.LinkTo(happyBlock);
Run Code Online (Sandbox Code Playgroud)

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