TPL数据流阻止具有.InputCount
和.OutputCount
属性。但它现在可以执行项目执行,并且没有像.Busy [Boolean]
这样的属性。那么有没有办法知道块现在是否正在运行且其中一个项目仍在那里?
更新
让我解释一下我的问题。 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
是否仍在运作的原因。对不起我的英语不好。
答案 0 :(得分:7)
即使您可以找出某个区块是否正在处理某个项目,它也无法帮助您实现目标。那是因为你需要在完全相同的时刻检查所有块的状态,并且没有办法做到这一点。
我认为您需要以某种方式手动跟踪已完成处理的项目数量,并将其与要处理的项目总数进行比较。
您应该知道从一开始就要处理的项目数(是您将它们发送到缓冲区块的人)。要跟踪已完全处理的项目数,可以向解析操作块添加计数器(不要忘记使计数器线程安全,因为您的操作块是并行的)。
然后,如果计数器达到要处理的项目总数,您就知道所有工作都已完成。