我如何检测所有 TransformManyBlocks 已完成

How do I detect all TransformManyBlocks have completed

我有一个 TransformManyBlock 可以创建很多 "actors"。它们流过几个 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 何时都已处理?完成似乎立即传播,只告诉你没有更多的项目要处理。这并没有告诉我最后一个 Actor 何时完成处理。

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

当一个块完成处理它的所有项目时,它就完成了它的 Completion 任务。您可以 await 该任务在所有块的工作完成后得到通知。

当你 link 块在一起时(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;