我如何检测所有 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
开启)你只需要调用第一个 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;
我有一个 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
开启)你只需要调用第一个 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;