BatchBlockT

(将一定数量的连续数据项分组为数据项集合)

BatchBlock 将 N 个单个项目组合成一个批处理项目,表示为元素数组。使用特定批处理大小创建实例,然后块在收到该数量的元素后立即创建批处理,将批处理异步输出到输出缓冲区。

BatchBlock 能够在贪婪和非贪婪模式下执行。

  • 在默认贪婪模式下,从任意数量的源提供给块的所有消息都被接受并缓冲以转换为批次。

    • 在非贪婪模式下,所有消息都会从源中推迟,直到有足够的消息来源向块提供消息以创建批处理。因此,BatchBlock 可用于从 N 个源中的每一个接收 1 个元素,从 1 个源接收 N 个元素,以及在它们之间的无数选项。

StackOverflow 文档

将请求批处理为 100 个组以提交到数据库

var batchRequests = new BatchBlock<Request>(batchSize:100);
var sendToDb = new ActionBlock<Request[]>(reqs => SubmitToDatabase(reqs));

batchRequests.LinkTo(sendToDb);

每秒创建一次批处理

var batch = new BatchBlock<T>(batchSize:Int32.MaxValue);
new Timer(() => { batch.TriggerBatch(); }).Change(1000, 1000);

Stephen Toub 介绍 TPL 数据流