我有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何时完成处理。
答案 0 :(得分:2)
TPL Dataflow中的完成是通过调用Complete
完成的,它立即返回并发出完成信号。这使得块拒绝进一步的消息,但它继续处理它已经包含的项目。
当一个块完成对其所有项的处理时,它将完成其Completion
任务。您可以await
在完成所有区块工作后通知该任务。
将块连接在一起(开启PropogateCompletion
)时,您只需要在第一个Complete
和await
最后一个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