.net - 是否有像 TransformBlock<TIn, TOut> 这样的数据流 block 允许不按顺序传播项目?

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

我对异步处理和 TPL 数据流试验还比较陌生。 我的场景:我有一个持续提供输入的 block ,对输入异步执行一个函数,然后返回结果。 (然后将结果传递给保存到数据库的另一个 block 。)该函数可能会在几毫秒内完成,也可能需要长达 10 秒的时间才能返回。该 block 设置为使用“无限制”并行处理。结果的顺序并不重要。

我开始使用 TransformBlock 但是(因为它维护了项目序列)单个慢项目会导致许多更快的项目堆积在它后面。在这种特定情况下,结果乱序传播不仅是可以接受的,而且是非常可取的。这允许结果以固定的速率流动,而不是在巨大的波浪中流动。

我已经搜索了好几次,寻找一个数据流 block 的实现,该 block 在项目完成后立即传播,但我还没有找到任何与此描述相匹配的东西。我放弃了,通过将一个 ActionBlock 和一个 BufferBlock“管道连接”在一起,创建了我自己的 NonSequentialBlock。它似乎可以完成这项工作,但我担心(由于我缺乏经验)我做错了什么,最终会咬我一口。是否有此模式的现有实现可用?

最佳答案

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

关于.net - 是否有像 TransformBlock<TIn, TOut> 这样的数据流 block 允许不按顺序传播项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415396/

相关文章:

c# - 使用 Parallel.ForEach() 的 yield return 的线程安全

c# - 在 ActionBlock 中等待异步 lambda

.net - 将 Nullable Integer 设置为 String Containing Nothing 会产生 0

.net - C#。检查 Type 是否为 .NET Framework,而不是我自己的类型

c# headless 浏览器,支持爬虫的 javascript

c# - 并行运行多个任务(可变编号)并在所有任务完成后继续

asp.net-mvc-3 - 通过 ASP.NET 同步上下文安全地执行任务,无需 AsyncManager.Sync

c# - C TPL 数据流 BatchBlock 等待完成永不返回

c# - 事件源异常 : No Free Buffers available from the operating system

.NET获取所有用户均可访问的本地临时目录