TPL数据流如何选择块来发布其中的项目

4
请查看下面的TPL Dataflow网络方案。 有一个URL列表,多个Load块和一个Parse块。 Load块使用不同的代理服务器加载HTML页面,所有这些块都链接到Parse块,其中进行CPU绑定的工作。如果在页面加载过程中出现异常,则将URL添加回列表。
我使用手工循环(如图)向Load块发布URL。 我的问题是:是否有任何块类型可以帮助选择要发布URL的Load块,而不是使用我的手工循环?例如,它将URL发布到第一个Load块,其.InputCount <=2。
还有一个问题:代理服务器在Dataflow执行期间可能变得不可用。我认为,如果我在URL列表中放置BufferBlock,那么如果有这样的能力,我将能够动态取消链接具有死代理的LoadBlocks与此BufferBlock。那么,有没有一种方法可以动态取消网络中的块链接?
1个回答

4

是否有任何块类型可以帮助我选择将URL发布到哪个Load块,而不是手动循环?例如,它将把URL发布到第一个Load块,并且.InputCount <=2。

您可以使用单个BufferBlock连接所有负载块。然后,将负载块的BoundedCapacity设置为3(正在处理的1个项目+输入和输出队列中的2个项目)。使用此设置,项目将等待在BufferBlock中,直到某个负载块中有空间可用。

是否有一种方法可以动态取消网络中的块链接?

是的,LinkTo()返回一个IDisposable,可用于销毁该链接(通过调用Dispose())。


非常感谢你,svick!一切都正常。我浪费了两个星期来调试那个循环,现在用几行代码就替换掉了它。 - AsValeO
现在我不知道如何检查 LinkTo 是否已被释放,看起来这是一个私有属性。我需要通过这种方式检查是否没有活动的 TransformBlocks - AsValeO
@ValeO 我认为你需要自己跟踪。例如,如果你有一个 IDisposable 的集合,调用 Dispose() 同时从集合中删除它。 - svick

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