如何知道TPL Dataflow Block是否忙?

AsV*_*leO 7 .net c# block task-parallel-library tpl-dataflow

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

在此输入图像描述

更新:

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

最初我发布所有网址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
Run Code Online (Sandbox Code Playgroud)

然后我打电话给TransformBlock.Complete他们所有人.但在这种情况下,仍然可以有最后的URL加载它TransformBlock.如果最后一个URL未成功加载,它将变为"丢失",因为TransformBlocks都不会将其取回.这就是为什么我想知道TransformBlocks是否还在运行.抱歉,我的英语不好.

在此输入图像描述

svi*_*ick 9

即使您可以找出某个区块是否正在处理某个项目,它也无法帮助您实现目标.那是因为您需要在完全相同的时刻检查所有块的状态,并且没有办法做到这一点.

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

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

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