等待前面的块完成处理,然后再继续
本文关键字:处理 然后 再继续 前面 等待 | 更新日期: 2023-09-27 18:35:36
我有一个看起来像这样的过程。
- 从文件夹中获取一组 CSV 文件
- 读取 CSV 文件,并将内容存储在数据库中
- 从数据库中读取数据并执行更多处理。
将步骤 2 和 3 分开的原因是将读取文件所涉及的问题与处理文件所涉及的问题分开。
我可以使用三个数据流块对此进行建模。我遇到的问题是,在所有文件都保存到数据库之前,我不希望块 3 启动。我需要某种方法来确定块 1 中拾取的所有文件是否已由块 2 处理。区块 2 的MaxDegreeOfParallelism
设置为 Unbounded
- 我希望它们并行处理。
我考虑过在前两个块上使用Encapsulate
,但我认为这行不通。也许我需要某种Batchblock
,但批次的大小并不相同。
我该怎么做?我需要创建自己的块类型吗?
这不适合单个 TDF 流,因为步骤 #2 不会将项目传递到步骤 #3,该步骤在前面已完成之后开始。
您应该有 2 个单独的流。第一个从文件夹读取并存储在数据库中,第二个从数据库中读取并开始处理。您可以通过等待 Completion
属性来等待第一个流完成:
var reader = // Create #1 block
var dbFiller = // Create #2 block
reader.LinkTo(dbFiller, new DataflowLinkOptions { PropagateCompletion = true }); // Link both blocks with Completion Propagation
reader.Post( // Queue up work for reader
await reader.Completion; // Asynchronously wait for previous steps to complete
var processor = // Create #3 block
processor.Post( // Queue up work for processor