接收集合并为每个元素调用其链接块的 TPL 数据流

Posted

技术标签:

【中文标题】接收集合并为每个元素调用其链接块的 TPL 数据流【英文标题】:TPL dataflow that receives a collection and calls its linked block for each element 【发布时间】:2018-05-06 15:22:08 【问题描述】:

对不起,如果已经有类似的问题,我找不到。

我有以下情况:

    我必须对图像进行一些处理,并且 TPL 数据流适合 很好,因为它让我可以轻松地完成我的不同部分 并行工作流和逻辑单元中的单独代码 有一个我无法控制的函数返回一个列表 图片。它用作我的网格中的第二个节点(或管道,更多 精确) Dataflow 网格中的所有其他节点都使用单个图像,因此我在第二个项目符号中提到的 I 之后的节点期望获得一个图像(这对于并行性很重要)

是否有一个我可以使用的块(或其他解决方案)接受IEnumerable<T> 或类似类型的输入,并将IEnumerable 的每个元素转发到期望接收T 的块?

我不想重新发明***,所以我想在深入研究 API 并尝试编写自定义块之前检查是否有简单的解决方案。此外,将错误和完成传播到管道末端也很重要。

感谢您的回答!

【问题讨论】:

更多details,可能是骗子。 【参考方案1】:

不需要自定义块。您正在寻找TransformManyBlock。这是一个简单的演示:

public async Task TransformManyExample() 
    var data = Enumerable.Range(0, 10).ToList();
    var block1 = new TransformManyBlock<IEnumerable<int>, int>(x => x);
    var block2 = new ActionBlock<int>(x => Console.WriteLine(x.ToString()));
    block1.LinkTo(block2, new DataflowLinkOptions()  PropagateCompletion = true );
    block1.Post(data);
    block1.Complete();
    await block2.Completion;

【讨论】:

谢谢,这正是我所需要的! 要跟进这个问题,是否有一种块模式允许您从TransformMany 开始,然后通过产生的“许多”项目的结果进行聚合?

以上是关于接收集合并为每个元素调用其链接块的 TPL 数据流的主要内容,如果未能解决你的问题,请参考以下文章

复制 NetBufferListInfo 数组而不是调用 NdisCopySendNetBufferListInfo?

使用ArrayList集合,对其添加100个不同的元素:................

将生成 IEnumerable<T> 的 TransformBlock 链接到接收 T 的块

用 TPL 数据流中的最新值替换缓冲值

jQuery 选择元素的父元素并为其使用 prependTo()

数据流块基础