1

オブジェクトの大規模なコレクションとそれらの順次読み取りを扱っています。これらの行に沿ったほとんどの質問はマルチスレッドに関するものであることがわかりましたが、配布可能なライブラリの誤用によるスレッド自体のエラーにもっと関心があります.

ライブラリ内のシステムは、潜在的に大規模なオブジェクトのコレクションを管理し、ある時点で、このコレクションの順次読み取りを実行し、各要素に対して操作を実行します。ライブラリの外に拡張できる要素の実装によっては、オブジェクトがコレクションから自身を削除しようとする場合があります。

これをオプションにしたいのですが、コレクションが順次読み取られているときにこれが発生すると、エラーが発生する可能性があります。読み取り中にコレクションの内容をロックし、順次読み取りが終了した後に実行されるスケジュールに削除要求を配置できるようにしたいと考えています。オブジェクトはコレクションへのパブリック アクセスを持たないため、削除リクエストはシステムを通過する必要があります。isReading フラグを使用することもできますが、もっと洗練された構造があるのではないかと思います。

C# または .NET はこれを行うためのツールを提供していますか? おそらくリストの内容をロックして、順次読み取り中に削除要求を傍受できるようにしますか? または、このシナリオではその動作を最初から実装する必要がありますか?

4

2 に答える 2

1

SynchronizedCollection<T>.NET 2.0+ でクラスを使用することを検討することをお勧めします。

または、次の質問への回答をご覧ください: SynchronizedCollection<T> と他の同時実行コレクションの違いは何ですか?

于 2012-09-10T00:13:38.267 に答える
0

次のトリックを使用できます

List<T> collection;

for(int index = collection; index >= 0; --index)
{
  var item = collection[index];

  if(MUST BE DELETED)
  {
    collection.RemoveAt(index); // this is faster
    OR
    collection.Remove(item);
  }
}

このコードは、コレクションが変更されてもクラッシュせず、コレクションの各アイテムを処理します

于 2012-09-10T01:38:33.657 に答える