如何知道TPL Dataflow块是否繁忙?

8
TPL Dataflow块有`.InputCount`和`.OutputCount`属性。但是它现在可以在项目上执行,而且没有像` .Busy [Boolean]`这样的属性。那么有没有办法知道块是否正在运行,并且其中一个项目仍然存在?
更新:
让我解释一下我的问题。这张图片显示了我当前的Dataflow网络方案。`BufferBlock`保存要加载的URL,`TransformBlock`的数量通过代理服务器加载页面,最后`ActionBlock`对加载的页面执行工作。`TransformBlock`具有预定义的`.BoundedCapacity`,因此`BufferBlock`等待任何一个`TransformBlocks`变为空闲状态,然后将项目发布到其中。
最初,我将所有URL发布到缓冲区块中。此外,如果`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。如果最后一个URL没有成功加载,则它就会“丢失”,因为没有一个TransformBlocks会将其重新获取回来。这就是为什么我想知道TransformBlock是否仍在运行。抱歉我的英语不好。

enter image description here


如果输入计数不为零且块未被取消,那么它为什么不会忙呢? - i3arnon
你为什么想知道那个? - svick
@svick,请查看更新。 - AsValeO
1个回答

11

即使您可以找出一个块是否正在处理一个项,也不会真正帮助您实现目标。这是因为您需要检查所有块的状态恰好在同一时刻,而没有办法做到这一点。

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

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

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


再次感谢你,svick。你让我的一天变得更美好了。 - AsValeO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接