2

いくつかの答えを見つけようとして、類似しているが同じではないリンクをいくつか読みました: バッチで BlockingCollection<T> を消費する方法

ただし、(上記のリンクで) GetConsumingEnumerable を使用しないと怪しいようです。

コンシューマー (特異である必要があります) がコレクションを空にしている間、プロデューサーを効果的にブロックする正しい方法は何ですか?

[バッチ処理を行いたいのは、各バッチが Web サービス呼び出しを行うためです。これは、すべてのメッセージ/アイテムが独自の呼び出しを必要とする場合にボトルネックとなります。メッセージ/アイテムのバッチ処理は、このボトルネックの解決策です。]

理想的には:

1) メッセージを受け取る

2) コレクションにプッシュする新しいプロデューサー タスク

3) コレクションが「フル」(任意の制限) の場合、すべてのプロデューサーをブロックし、新しいコンシューマー タスクがコレクションのすべてを消費してから、プロデューサーのブロックを解除します。

言い換えると; (並列プロデューサー) xor (単一の消費者) がいつでもコレクションに作用することを望みます。

これは以前に行われるべきだったようですが、特にこのように動作するコードスニペットが見つからないようです。

助けてくれてありがとう。

4

2 に答える 2

0

あなたの漠然とした説明によると、ダブルバッファがあなたが望むものだと思います。

単純に 2 つのバッファーを作成します。プロデューサーは 1 つまで書き込みます。いっぱいになるか、タイマーが切れると、2 番目のものに「交換」され、プロデューサーは新しいものへの書き込みを開始します。次に、コンシューマーは最初の、現在はいっぱいになったバッファーの読み取りを開始します。

これにより、プロデューサーとコンシューマーの両方を同時に実行できます。そして、ループを再度繰り返す前に、消費者が以前に作成したすべての作業をバッチで処理することを確認します。

于 2015-04-07T04:36:46.173 に答える