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

TPL dataflow that receives a collection and calls its linked block for each element

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

我有以下情况:

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

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

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

感谢您的回答!

不需要自定义块。您正在寻找 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;
}