TPL 数据流块具有 .InputCount.OutputCount 属性。但是它现在可以对 item 执行执行,并且没有像 .Busy [Boolean] 这样的属性。那么有没有办法知道块现在是否正在运行并且其中一个项目还在那里?

更新:

让我解释一下我的问题。上图是我当前的 Dataflow 网络方案。BufferBlock 保存要加载的 URL,通过代理服务器加载 TransformBlock 页面的数量,最后 ActionBlock 对加载的页面执行工作。 TransformBlock s 已预定义 .BoundedCapacity ,因此 BufferBlock 等待任何 TransformBlocks 变为空闲,然后将项目发布到其中。

最初我将所有 URL 发布到 Buffer Block 。此外,如果 TransformBlock 之一在加载 HTML 期间抛出异常,它会将其 URL 返回给 BufferBlock 。所以我的目标是以某种方式等到我的所有 URL 都被保证加载和解析。现在我正在等待这样的:

Do While _BufferBlock.Count > 0 Or _
         GetLoadBlocksTotalInputOutputCount(_TransformBlocks) > 0 Or _
         _ActionBlock.InputCount > 0

        Await Task.Delay(1000)
Loop

然后我对所有这些都调用 TransformBlock.Complete。但是在这种情况下,仍然可以有最后一个 URL 加载它 TransformBlock s。如果最后一个 URL 没有成功加载,它就会“丢失”,因为 TransformBlocks 都不会收回它。这就是为什么我想知道 TransformBlock 是否仍在运行。对不起我的英语不好。

最佳答案

即使你能发现一个块是否正在处理一个项目,它也不会真正帮助你实现你的目标。那是因为您需要在完全相同的时刻检查所有块的状态,而没有办法做到这一点。

我认为您需要以某种方式手动跟踪已完全处理的项目数,并将其与要处理的项目总数进行比较。

您应该从一开始就知道要处理的项目数(是您将它们发送到缓冲区块)。要跟踪已完全处理的项目数,您可以向解析操作块添加一个计数器(不要忘记使计数器线程安全,因为您的操作块是并行的)。

然后,如果计数器达到要处理的项目总数,您就知道所有工作都已完成。

关于c# - 如何知道 TPL 数据流块是否忙?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23406994/

10-08 20:40