gpt4 book ai didi

c# - 我如何检测所有 TransformManyBlocks 已完成

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:11 25 4
gpt4 key购买 nike

我有一个 TransformManyBlock 可以创建许多“ Actor ”。它们流经多个 TransformBlocks 处理。一旦所有 Actor 都完成了所有步骤,我需要再次将所有内容作为一个整体进行处理。

决赛

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 完成的它立即返回并发出完成信号。这使得该 block 拒绝进一步的消息,但它会继续处理它已经包含的项目。

当一个 block 完成处理它的所有项目时,它完成它的 Completion任务。你可以await当所有 block 的工作完成时,该任务将被通知。

当你将 block 链接在一起时(打开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;

关于c# - 我如何检测所有 TransformManyBlocks 已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31547220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com