TPL 数据流 block 具有 .InputCount
和 .OutputCount
属性。但是它现在可以对 item 执行,并且没有像 .Busy [Boolean]
这样的属性。那么有没有办法知道 block 现在是否正在运行并且其中一个项目仍然存在?
更新:
让我解释一下我的问题。图片上是我当前的数据流网络方案。
BufferBlock
保存要加载的 URL,TransformBlock
通过代理服务器加载页面的数量,最后的 ActionBlock
执行加载页面的工作。 TransformBlock
已经预定义了 .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
。如果最后一个 URL 没有成功加载,它就会“丢失”,因为没有一个 TransformBlocks 不会收回它。这就是为什么我想知道 TransformBlock
是否仍在运行。抱歉我的英语不好。
最佳答案
即使您可以查明某个方 block 是否正在处理某个项目,它也无助于您实现目标。那是因为您需要在同一时刻检查所有 block 的状态,而没有办法做到这一点。
我认为您需要以某种方式手动跟踪已完全处理的项目数,并将其与要处理的项目总数进行比较。
您应该从一开始就知道要处理的项目数(是您将它们发送到缓冲区 block )。要跟踪已完全处理的项目数,您可以向解析操作 block 添加一个计数器(不要忘记使计数器线程安全,因为您的操作 block 是并行的)。
然后,如果计数器达到要处理的项目总数,您就知道所有工作都已完成。
关于c# - 知道 TPL 数据流 block 是否繁忙的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406994/