0

私は、外部フィードからデータをロードして内部コレクションに保存するマルチスレッド アプリケーションに取り組んでいます。これらのコレクションは、外部フィードからすべてのデータを再度ロードすることにより、X 分ごとに 1 回更新されます。これらのコレクションからの追加/削除は他になく、読み取るだけです。

通常、コレクションにアクセスしているすべての場所と同じように、更新中にロックを使用します。

質問:

この場合、並行コレクションは私の人生を楽にしてくれますか? 基本的に私は2つのアプローチを見ます

  1. 外部フィードからデータをロードし、もう存在しないアイテムを削除し、不足しているアイテムを追加し、変更されたアイテムを更新します。これは、同時収集の助けを借りて良い解決策だと思います (ロックは必要ありませんよね?)。私の側からのコードが多すぎます。

  2. 古いコレクション オブジェクトを新しいオブジェクトでオーバーライドするだけです (例: _data = new ConcurentBag(newData)。ここで、同時コレクションを使用してもまったく利点がないことは確かです。そうですか? ロック メカニズムが必要です。

並行コレクションを使用して、すぐに使用できるソリューションはありますか? 車輪の再発明は二度としたくありません。

4

1 に答える 1

1

はい、並行コレクションの場合、ロックメカニズムはコレクション内に保存されるためnew、古いコレクションの代わりにコレクションを作成すると、目的が果たせなくなります。それらは主に生産者と消費者の状況で使用され、通常は と組み合わせて使用​​されBlockingCollection<T>ます。プロデューサーがデータを追加する以上のことを行う場合、事態は少し複雑になります。

同時コレクションを使用しないことの利点は、ロック メカニズムがコレクションに依存しなくなることです。別の同期objectを行うことができ、クリティカル セクション内では、必要lockに応じて別のインスタンスを自由に割り当てることができます。

あなたの質問に答えるために-私はあなたが望むことをするためのすぐに使えるメカニズムを知りませんが、lock「車輪の再発明」という単純なステートメントを使用して呼び出すことはしません。forこれは、ループの使用が車輪の再発明であると言っているのと少し似ています。非並行コレクションと一緒に別の同期オブジェクトを用意するだけです。

于 2016-02-05T10:48:48.573 に答える