如何知道TPL Dataflow Block是否忙?

时间:2014-05-01 11:44:40

标签: c# .net task-parallel-library block tpl-dataflow

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

enter image description here

更新

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

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

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

        Await Task.Delay(1000)
Loop

然后我给所有人打电话TransformBlock.Complete。但在这种情况下,仍然可以有最后一个URL加载它TransformBlock。如果最后一个网址未成功加载,则会丢失',因为所有TransformBlock都不会将其取回。这就是为什么我想知道TransformBlock是否仍在运作的原因。对不起我的英语不好。

enter image description here

1 个答案:

答案 0 :(得分:7)

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

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

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

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