如何检测所有TransformManyBlocks已完成

时间:2015-07-21 18:47:24

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

我有TransformManyBlock创造了许多“演员”。它们经过了几次TransformBlocks处理。一旦所有演员完成了所有步骤,我需要再次处理所有事情。

最后的

var CopyFiles = new TransformBlock<Actor, Actor>(async actor =>
{
    //Copy all fo the files and then wait until they are all done
    await actor.CopyFiles();
    //pass me along to the next process
    return actor;
}, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = -1 });

如何检测所有演员何时被处理?完成似乎立即传播,只告诉你没有更多的项目要处理。这并没有告诉我最后一个Actor何时完成处理。

1 个答案:

答案 0 :(得分:2)

TPL Dataflow中的完成是通过调用Complete完成的,它立即返回并发出完成信号。这使得块拒绝进一步的消息,但它继续处理它已经包含的项目。

当一个块完成对其所有项的处理时,它将完成其Completion任务。您可以await在完成所有区块工作后通知该任务。

将块连接在一起(开启PropogateCompletion)时,您只需要在第一个Completeawait最后一个Completion属性上调用var copyFilesBlock = new TransformBlock<Actor, Actor>(async actor => { await actor.CopyFilesAsync(); return actor; }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = -1 }); // Fill copyFilesBlock copyFilesBlock.Complete(); await copyFilesBlock.Completion;

timeout.php