我正在构建一个组件,该组件从给定的 url 下载信息并将其解析为我的业务类。
这必须分两个阶段进行。正在下载的页面包含指向在第二阶段下载的一组其他页面的 URL。
我希望所有这些都尽可能并行,并试图通过使用 TPL 数据流框架来降低整体复杂性。
这是我的(简化的)设置:
- 我将 URL 发布到缓冲区块,缓冲区块将它们移动到下载块。
- 在下载块中下载 HTML。
- 下载块有两个解析块的条件链接,因此页面类型 A 的 html 被移动到“解析页面 A”,这是一个TransformManyBlock。
- 解析页面 A 生成一组指向类型 B 页面的 URL。
- 这些将再次发布到下载块。
- 最后,条件链接将页面类型 B 的 HTML 发布到最后一个块。
我正在重用下载块,因为我想通过设置 MaxDegreeOfParallelization 以这种方式限制与服务器的最大连接数。
如果我可以简单地使用两个单独的下载块,设置会容易得多,但是我将无法以这种方式限制连接数,并且仍然有尽可能多的并行连接。
现在我对这个设置的问题:
如何正确传播完成?当我发布完所有 URL 后,我在缓冲区块上调用Complete() 。但是我不能直接将它传播到下载块,因为从“解析页面 A”块生成的 URL 可能仍然需要它,即使在缓冲区块已将所有 URL 发布到它之后。
但我也将下载块完成与缓冲区块和解析页面 A 块完成结合起来,因为这样解析页面 A 将永远不会完成。
我还考虑过在缓冲区块完成后调用“解析页面 A”的 Complete(),但是下载块中可能仍有数据将被“解析块 A”拒绝。
有没有办法摆脱这种循环困境?
还是我完全走错了路,应该以其他方式做?