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

C# 接收集合并为每个元素调用其链接块的TPL数据流,c#,task-parallel-library,dataflow,tpl-dataflow,C#,Task Parallel Library,Dataflow,Tpl Dataflow,对不起,如果已经有类似的问题,我找不到 我有以下情况: 我必须对图像进行一些处理,TPL数据流适合我 这里很好,因为它允许我轻松地完成我工作的不同部分 并行工作流和逻辑单元中的独立代码 有一个我无法控制的函数,它返回 图像。它被用作网格(或管道,更详细地说)中的第二个节点 精确的) Dataflow mesh中的所有其他节点都使用一个映像,因此在第二个项目符号中提到的I之后的节点期望得到一个映像(这对于并行性很重要) 是否有一个我可以使用的块(或其他解决方案)可以接受类型为IEnumerable

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

我有以下情况:

  • 我必须对图像进行一些处理,TPL数据流适合我 这里很好,因为它允许我轻松地完成我工作的不同部分 并行工作流和逻辑单元中的独立代码
  • 有一个我无法控制的函数,它返回 图像。它被用作网格(或管道,更详细地说)中的第二个节点 精确的)
  • Dataflow mesh中的所有其他节点都使用一个映像,因此在第二个项目符号中提到的I之后的节点期望得到一个映像(这对于并行性很重要)
  • 是否有一个我可以使用的块(或其他解决方案)可以接受类型为
    IEnumerable
    或类似的输入,并将该
    IEnumerable
    的每个元素转发到预期接收
    T
    的块

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


    谢谢你的回答

    不需要自定义块。你要找的是那个。下面是一个简单的演示:

    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;
    }
    
    public异步任务TransformManyExample(){
    var data=Enumerable.Range(0,10).ToList();
    var block1=新的TransformManyBlock(x=>x);
    var block2=newactionblock(x=>Console.WriteLine(x.ToString());
    block1.LinkTo(block2,新的DataflowLinkOptions(){PropagateCompletion=true});
    区块1.邮政(数据);
    block1.Complete();
    等待区块2.完成;
    }
    
    还有一些,可能是被骗。谢谢,这正是我需要的!接下来,是否有一个块模式允许您从
    TransformMany
    开始,然后通过生成的“多”项的结果进行聚合?