41

SynchronizedCollection<T>System.Collections.Concurrent名前空間の並行コレクションは、並行コレクションが名前空間であり、SynchronizedCollection<T>がクラスであること以外はどう違うのですか?SynchronizedCollection <T>と他の同時収集の違いは何ですか?

SynchronizedCollection<T>であり、コンカレントコレクションのすべてのクラスはスレッドセーフなコレクションを提供します。いつ他のものを使用するのか、その理由は何ですか?

+1

はこちらをご覧:http://stackoverflow.com/questions/1946520/why-are-there-no-concurrent-collections-in-cを – StuartLC

答えて

50

SynchronizedCollection<T> classは、.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 namespaceで提供されているさまざまな種類のコレクションを選択する場合と同様に、特定のニーズに最適な機能と特性を持つものを選択する必要があります。

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

MSDNのこの記事も読む価値がある:When to Use a Thread-Safe Collection

+0

バージョン4.0を使用しているので、SynchrinozedCollecction よりSystem.Collections.Concurrentを好むことができます。 – Batrickparry

+1

これらの新しいコンカレント・コレクションがスレッドの安全性のためにロックを使用しない場合、並行性はどのように達成されますか? – Matt

+2

@Matt:いろいろなやり方。その答えはおそらく、それ自身の質問に値するほど複雑なものになるでしょう。しかし、インスピレーションのために、ここを見て:http://stackoverflow.com/questions/1688870/how-might-a-class-like-nets-concurrentbagt-be-implementedそしてここに:http://stackoverflow.com/questions/4785622/why-is-concurrentbagt-so-slow-in-net-4-0-am-i-doing-it-wrong(リンク先のMSDN記事を読んだことがありますか?おそらくあなた自身の実装を書くのに十分ではないにしても、ロックの代わりに使うトリックです。) –

関連する問題