web-dev-qa-db-ja.com

SynchronizedCollection <T>と他の同時コレクションの違いは何ですか?

SynchronizedCollection<T>System.Collections.Concurrent名前空間の並行コレクションは、並行コレクションが名前空間であり、SynchronizedCollection<T>がクラスであることを除いて、どのように異なるのですか?

SynchronizedCollection<T>およびConcurrent Collectionsのすべてのクラスは、スレッドセーフなコレクションを提供します。どちらをいつ使用するかをどのように決定しますか、そしてそれはなぜですか?

53
Batrickparry

SynchronizedCollection<T>クラスは、スレッドセーフなコレクションクラスを提供するために.NET 2.0で最初に導入されました。これはロックを介して行われるため、基本的にはすべてのアクセスがlockステートメントでラップされるList<T>があります。

System.Collections.Concurrentネームスペースははるかに新しいです。これは.NET 4.0まで導入されておらず、大幅に改善され、より多様な選択肢が含まれています。これらのクラスはロックを使用してスレッドセーフティを提供しなくなりました。つまり、複数のスレッドが同時にデータにアクセスしている状況で、より適切にスケーリングする必要があります。ただし、IList<T>インターフェースを実装するクラスは、これらのオプションには特にありません。

したがって、.NET Frameworkのバージョン4.0を対象としている場合は、可能な限りSystem.Collections.Concurrent名前空間によって提供されるコレクションの1つを使用する必要があります。 System.Collections.Generic名前空間 で提供されるさまざまなタイプのコレクションから選択するのと同じように、特定のニーズに最適な機能と特性を持つコレクションを選択する必要があります。

古いバージョンの.NET Frameworkを対象にしている場合、またはIList<T>インターフェイスを実装するコレクションクラスが必要な場合は、SynchronizedCollection<T>クラスを選択する必要があります。

MSDNに関するこの記事も一読の価値があります。 スレッドセーフコレクションを使用する場合

58
Cody Gray