在继续之前等待先前的块完成处理

时间:2014-12-29 09:27:53

标签: c# .net task-parallel-library tpl-dataflow

我有一个看起来像这样的过程。

  1. 从文件夹中获取一组CSV文件
  2. 阅读CSV文件,并将内容存储在数据库中
  3. 从数据库中读取数据并执行更多处理。
  4. 分离步骤2& 3是分离从处理文件涉及的问题中读取文件所涉及的问题。

    我可以使用三个数据流块对此进行建模。我遇到的问题是,我不希望块3启动,直到所有文件都持久存储到数据库。我需要一些方法来确定块1中已经处理了块1中拾取的所有文件。块2将MaxDegreeOfParallelism设置为Unbounded - 我希望它们并行处理。< / p>

    我考虑在前两个街区使用Encapsulate,但我认为这不会奏效。也许我需要某种Batchblock,但批次的大小不一样。

    我该怎么做?我是否需要创建自己的块类型?

1 个答案:

答案 0 :(得分:1)

这不适合单个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