接收集合并为每个元素调用其链接块的 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 的块