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

pap*_*ane 4 c# dataflow task-parallel-library tpl-dataflow

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

我有以下情况:

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

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

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

谢谢你的回答!

JSt*_*ard 6

不需要自定义块。您正在寻找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;
}
Run Code Online (Sandbox Code Playgroud)