В чем разница между SynchronizedCollection <T> и другими параллельными коллекциями?

Как SynchronizedCollection<T> и параллельные коллекции в пространстве имен System.Collections.Concurrent отличаются друг от друга, за исключением параллельных коллекций, являющихся пространством имен, и SynchronizedCollection<T> является классом?

SynchronizedCollection<T>, и все классы в параллельных коллекциях предоставляют поточно-безопасные коллекции. Как я могу решить, когда использовать один над другим, и почему?

Ответ 1

SynchronizedCollection<T> класс был впервые представлен в .NET 2.0 для обеспечения потокобезопасного класса коллекции. Он делает это с помощью блокировки, так что вы по существу имеете List<T>, где каждый доступ заключен в оператор lock.

Пространство имен System.Collections.Concurrent намного новее. Он не был представлен до .NET 4.0 и включает в себя существенно улучшенный и более разнообразный набор вариантов. Эти классы больше не используют блокировки для обеспечения безопасности потоков, что означает, что они должны лучше масштабироваться в ситуации, когда несколько потоков одновременно получают доступ к своим данным. Однако класс, реализующий интерфейс IList<T>, особенно отсутствует среди этих параметров.

Итак, если вы ориентируетесь на версию 4.0.NET Framework, вы должны использовать одну из коллекций, предоставляемую пространством имен System.Collections.Concurrent, когда это возможно. Как и при выборе между различными типами коллекций, представленными в пространстве имен System.Collections.Generic, вам нужно выбрать тот, чьи функции и характеристики лучше всего соответствуют вашим конкретным потребностям.

Если вы настроили таргетинг на более раннюю версию .NET Framework или вам нужен класс коллекции, который реализует интерфейс IList<T>, вам нужно выбрать класс SynchronizedCollection<T>.

Эта статья о MSDN также заслуживает внимания: Когда использовать сборку с потоками