2

同じ BlockingCollection にアクセスする C# アプリケーションで 2 つのスレッドを使用しています。これは正常に動作しますが、2 つのスレッドが同じ値を取得するように、最初の値を 2 回取得したいと考えています *.

数秒後、両方のスレッドの currentIndex をポーリングし、すべての値 < インデックスを削除します。たとえば、スレッドの currentIndex の最小値が 5 の場合、アプリケーションはキュー内のインデックス 0 ~ 5 のアイテムを削除します。別の解決策は、すべてのスレッドが値を処理した場合に、キュー内の値を削除することです。

どうすればこれを達成できますか? 別のタイプのバッファが必要だと思います..?

前もって感謝します!

* .Take() がスレッド 1 によって呼び出された場合、アイテムはコレクションから削除され、スレッド 2 は同じアイテムを再び取得できなくなります。


アップデート:

データをバッファに保存したいので、たとえばスレッド1がデータをHDDに保存し、スレッド2が(同じ)データを分析します(並行)。

4

2 に答える 2

5

プロデューサー/コンシューマーを使用して、Value1 を 2 つの別個の ConcurrentQueues に追加します。スレッドをデキューしてから、独自のキューから処理します。

2014 年 7 月 4 日編集: ぼんやりした、ハッキーな、半ば考え抜かれた解決策があります: バッファリングされるカスタム オブジェクトを作成します。スレッド 1 でバッファリングしようとしている情報と、スレッド 2 での分析結果の両方のためのスペースが含まれる場合があります。

オブジェクトをスレッド 1 のバッファーと BlockingCollection に追加します。スレッド 2 を使用して結果を分析し、結果でオブジェクトを更新します。ブロッキング コレクションは大きくなりすぎてはいけません。また、参照のみを処理するため、メモリにヒットすることもありません。これは、両方のスレッドで同時にバッファー内の情報を変更しないことを前提としています。

もう 1 つの解決策は、バッファとブロッキング コレクションに同時に情報をフィードすることです。BlockingCollection からのデータを分析し、それを出力コレクションにフィードして、再度バッファーと照合します。このオプションは、正しく実行すれば同時変更を処理できますが、おそらくより多くの作業が必要になります。

オプション1の方が良いと思います。私が指摘したように、これらは半分しか形成されていませんが、特定のニーズに合ったものを見つけるのに役立つかもしれません. 幸運を。

于 2014-04-03T13:47:56.690 に答える