有没有类似于TransformBlock<TIn, TOut>的数据流块,可以允许项目按照非连续序列传播?

3
我对异步处理和TPL Dataflow相对较新。我的场景是:一个块不断地接收输入,异步地对输入执行函数并返回结果(然后将结果传递给保存到数据库的另一个块)。该函数可能在几毫秒内完成,也可能需要长达10秒才能返回结果。该块已设置为使用“无限制”并行处理方式。结果的顺序并不重要。
我最初使用了TransformBlock,但由于它保持了项目序列,单个缓慢的项目会导致许多更快的项目堆积在其后面。在这种特定情况下,即使结果以非顺序方式传播出去,也不仅可以接受,而且非常理想。这样可以使结果以平稳的速率流动,而不是像巨浪一样涌来。
我已经多次搜索,寻找一个实现Dataflow块的方法,以便在项目完成后立即传播它们,但我还没有找到与此描述匹配的任何内容。我放弃了,并通过“粘合”ActionBlock和BufferBlock创建了自己的NonSequentialBlock。它似乎能够胜任工作,但我担心(由于缺乏经验)我做错了什么,最终会遭受损失。是否有现有的这种模式的实现可用?

1
ActionBlock会向BufferBlock发布吗? - i3arnon
@I3arnon 这是正确的。 - Michael Richardson
2个回答

3

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


那应该完美地运行。我不知道Encapsulate方法的存在。谢谢! - Michael Richardson

1
新增了一个选项EnsureOrdered,它属于DataflowBlockOptions类,用于决定数据流块是否按照输入消息的顺序输出已处理的结果。默认情况下该属性值为true。将该属性设置为false会使块在处理完消息后立即传播它们,忽略它们的原始顺序。
此选项于2016年引入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接