是否存在像TransformBlock <tin,tout =“”>这样的数据流块,它允许项目不按顺序传播?</tin,>

时间:2014-12-11 04:30:21

标签: .net task-parallel-library tpl-dataflow

我对异步处理和使用TPL Dataflow进行实验相对较新。 我的场景:我有一个连续提供输入的块,异步执行输入上的函数,并返回结果。 (然后将结果传递给另一个保存到数据库的块。)该函数可能在几毫秒内完成,或者可能需要10秒才能返回。该块设置为以“无界”并行性进行处理。结果的排序并不重要。

我开始使用TransformBlock但是(因为它维护了项目序列)一个缓慢的项目会导致许多更快的项目堆积在它后面。在这种特定情况下,不仅可以接受结果不按顺序传播而且非常需要。这样可以使结果以常规速率流动,而不是以巨浪形式流动。

我已多次搜索,寻找一个Dataflow块的实现,它会在项目完成后立即传播,但我还没有找到符合此描述的任何内容。我放弃并创建了自己的NonSequentialBlock,通过“管道录音”将ActionBlockBufferBlock组合在一起。它似乎做了这项工作,但我担心(由于我缺乏经验)我做错了什么,最终会咬我。是否可以使用此模式的现有实现?

2 个答案:

答案 0 :(得分:2)

不,你没有做错任何事。通常通过组合基本块来创建自己的块,然后调用Encapsulate来封装它们并呈现单个IPropagator块。

答案 1 :(得分:1)

新的选项EnsureOrdered已添加到DataflowBlockOptions类,该选项确定数据流块是否将按输入消息的顺序输出处理后的结果。默认情况下,此属性为true。将此属性设置为false可使该块在处理消息后立即传播它们,而忽略其原始顺序。

此选项于2016年引入。