c# - 知道 TPL 数据流 block 是否繁忙的方法?

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

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

enter image description here

更新:

让我解释一下我的问题。图片上是我当前的数据流网络方案。 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 是否仍在运行。抱歉我的英语不好。

enter image description here

最佳答案

即使您可以查明某个方 block 是否正在处理某个项目,它也无助于您实现目标。那是因为您需要在同一时刻检查所有 block 的状态,而没有办法做到这一点。

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

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

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

关于c# - 知道 TPL 数据流 block 是否繁忙的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406994/

相关文章:

c# - 在没有 Wait() 的情况下使用 TPL 处理异常

c# - XAML 设计未在 Visual Studio 中加载

C# 按钮不重新定位自己

c# - 使用 Unity Photon 将玩家位置发送给另一个玩家以在多人游戏中移动他

c# - 如何在 NUnit 2.5 中使用 TestCase?

c# - Log4Net smtp appender 仅在出现完整日志(调试和信息和错误)错误时发送电子邮件。仅当应用程序结束时

c# - 将事件解决方案平台从任何 CPU 更改为 x86 时,WPF 应用程序未启动

.net - 如何启动一个接受参数并返回值的任务?

c# - 在 asp.net 中传递双引号

c# - 任务取消和任务继续选项