我对异步处理和使用TPL Dataflow进行实验相对较新。 我的场景:我有一个连续提供输入的块,异步执行输入上的函数,并返回结果。 (然后将结果传递给另一个保存到数据库的块。)该函数可能在几毫秒内完成,或者可能需要10秒才能返回。该块设置为以“无界”并行性进行处理。结果的排序并不重要。
我开始使用TransformBlock
但是(因为它维护了项目序列)一个缓慢的项目会导致许多更快的项目堆积在它后面。在这种特定情况下,不仅可以接受结果不按顺序传播而且非常需要。这样可以使结果以常规速率流动,而不是以巨浪形式流动。
我已多次搜索,寻找一个Dataflow块的实现,它会在项目完成后立即传播,但我还没有找到符合此描述的任何内容。我放弃并创建了自己的NonSequentialBlock
,通过“管道录音”将ActionBlock
和BufferBlock
组合在一起。它似乎做了这项工作,但我担心(由于我缺乏经验)我做错了什么,最终会咬我。是否可以使用此模式的现有实现?
答案 0 :(得分:2)
不,你没有做错任何事。通常通过组合基本块来创建自己的块,然后调用Encapsulate来封装它们并呈现单个IPropagator块。
答案 1 :(得分:1)
新的选项EnsureOrdered
已添加到DataflowBlockOptions
类,该选项确定数据流块是否将按输入消息的顺序输出处理后的结果。默认情况下,此属性为true
。将此属性设置为false
可使该块在处理消息后立即传播它们,而忽略其原始顺序。
此选项于2016年引入。