問題タブ [tpl-dataflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - TransformBlock を再利用して最大ダウンロード接続を強制する
特定の 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" によって拒否されます。
この循環的なジレンマから抜け出す方法はありますか?
または、私は完全に間違った方向に進んでおり、他の方法でそれを行う必要がありますか?
c# - TPL で継続的に実行されるデータフロー ブロックを実装する方法は?
BufferBlock と ActionBlock を使用してプロデューサー/コンシューマー データフロー ブロックをセットアップしましたが、コンソール アプリケーション内で正常に動作しています。
すべてのアイテムを BurfferBlock に追加し、BufferBlock を他のアクション アイテムとリンクした後。それはうまくいっています。
ここで、このデータフロー ブロック パイプラインが常に稼働している内部サービスを使用したいと考えています。また、外部イベントを介してメッセージが利用可能になると、メッセージは bufferblock 内に入り、処理が開始されます。どうすればこれを達成できますか?
これまでのところ、私は以下を行っています:
c# - Windows Phone 用 Microsoft TPL データフロー
私たちが知っているように、Microsoft TPL Dataflowは次のプラットフォームをサポートしています。
- .NET フレームワーク 4.5
- Windows ストア アプリ用の .NET
- ポータブル クラス ライブラリ
ただし、Windows Phone 8 のサポートはありません。
BufferBlock<> などを置き換える代替手段は何ですか?
c# - BufferBlock 内のアイテムを反復処理する方法?
最近、.NET 4.5 から TPL Dataflow ライブラリを使い始めましたが、ブロックの概念全体が初めてです。アプリケーションにプロデューサー/コンシューマー キューを実装しています。メッセージが重複してキューに入れられるのを防ぐ必要があるため、メッセージが既にキューに入れられているかどうかを確認する必要があります。タイプを使用していますBufferBlock<Message>
(Message
カスタムタイプです)。BufferBlock
Count プロパティがありますが、メッセージを一意に識別する必要があるため、この問題では役に立ちません。
アイテムが含まれているかどうかを確認する方法、BufferBlock
またはすべてのアイテムを調べて検査する方法はありますか? BufferBlock
アイテムの反復を可能にするものにキャストすることは可能ですか? MSDN で見た例に従っていますが、アイテムがキューにあるかどうかはチェックされませんが、キューの内容をチェックすることはかなり必要な操作だと思います。どんな助けでも大歓迎です。