特定の URL から情報をダウンロードし、ビジネス クラスに解析するコンポーネントを構築しています。
これは 2 段階で行われる必要があります。ダウンロード中のページには、第 2 段階でダウンロードされる一連のさらなるページへの URL が含まれています。
私はこれらすべてを可能な限り並列にしたいと考えており、TPL Dataflow フレームワークを使用して全体的な複雑さを軽減しようとしています。
これは私の(簡略化された)セットアップです:
- URL をダウンロード ブロックに移動するバッファー ブロックに投稿します。
- ダウンロード ブロックでは、HTML がダウンロードされます。
- ダウンロード ブロックには両方の解析ブロックへの条件付きリンクがあるため、ページ タイプ A の html はTransformManyBlockである「解析ページ A」に移動されます。
- ページ A を解析すると、タイプ B のページへの一連の URL が生成されます。
- それらは再度ダウンロード ブロックに投稿されます。
- 最後に、条件付きリンクはページ タイプ B の HTML を最後のブロックにポストします。
MaxDegreeOfParallelization を設定して、この方法でサーバーへの最大接続数を制限したいので、ダウンロード ブロックを再利用しています。
単純に 2 つの個別のダウンロード ブロックを使用できれば、セットアップははるかに簡単になりますが、この方法で接続数を制限することはできず、可能な限り多くの並列接続を維持できません。
今、このセットアップに関する私の問題:
Completion を正しく伝達するにはどうすればよいですか? すべての URL の投稿が完了したら、Buffer Block でComplete()を呼び出します。しかし、バッファ ブロックがすべての URL をポストした後でも、「Parse Page A」ブロックから生成された URL にはまだ必要になる可能性があるため、これをダウンロード ブロックに直接伝達することはできません。
しかし、ダウンロード ブロックの完了を Buffer Block と Parse Page A Block Completion の両方に結合します。これは、Parse Page A が完了しないためです。
また、バッファ ブロックが完了したときに "Parse Page A" の Complete() を呼び出すことも考えましたが、ダウンロード ブロックにデータが残っている可能性があり、"Parse Block A" によって拒否されます。
この循環的なジレンマから抜け出す方法はありますか?
または、私は完全に間違った方向に進んでおり、他の方法でそれを行う必要がありますか?