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

时间:2017-11-22 19:16:32

标签: c# task-parallel-library dataflow tpl-dataflow

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

我有以下情况:

  1. 我必须对图像进行一些处理,并且TPL Dataflow适合 很好地在这里,因为它允许我轻松地做我的不同部分 并行工作流程和逻辑单元中的单独代码
  2. 有一个我无法控制的函数返回一个列表 图片。它被用作我的网格(或管道中的第二个节点,更多 精确)
  3. Dataflow网格中的所有其他节点都使用单个图像,因此我在第二个项目中提到的节点之后的节点需要获得一个图像(这对于并行性原因很重要)
  4. 是否存在我可以使用的块(或其他解决方案),它将采用类型IEnumerable<T>或类似的输入,并将该IEnumerable的每个元素转发到期望接收的块{ {1}}?

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

    感谢您的回答!

1 个答案:

答案 0 :(得分:4)

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