41

¿Cómo se diferencian SynchronizedCollection<T> y las colecciones concurrentes en el espacio de nombre System.Collections.Concurrent, además de que las Colecciones simultáneas son un espacio de nombres y SynchronizedCollection<T> es una clase?¿Cuál es la diferencia entre SynchronizedCollection <T> y las otras colecciones concurrentes?

SynchronizedCollection<T> y todas las clases en Colecciones simultáneas proporcionan colecciones seguras para subprocesos. ¿Cómo decido cuándo usar uno sobre el otro y por qué?

+1

un vistazo aquí: http://stackoverflow.com/questions/1946520/why-are-there-no-concurrent-collections-in-c – StuartLC

Respuesta

50

La SynchronizedCollection<T> class se introdujo por primera vez en .NET 2.0 para proporcionar una clase de colección de subprocesos. Lo hace a través del bloqueo para que esencialmente tenga un List<T> donde cada acceso se envuelve en una declaración lock.

El System.Collections.Concurrent namespace es mucho más nuevo. No se introdujo hasta .NET 4.0 e incluye un conjunto de opciones sustancialmente mejorado y más diverso. Estas clases ya no usan bloqueos para proporcionar seguridad de subprocesos, lo que significa que deben escalarse mejor en una situación en la que varios subprocesos acceden a sus datos simultáneamente. Sin embargo, una clase que implementa la interfaz IList<T> está notablemente ausente entre estas opciones.

lo tanto, si usted está apuntando la versión 4.0 de .NET Framework, se debe utilizar una de las colecciones que proporciona el espacio de nombres System.Collections.Concurrent siempre que sea posible. Al igual que con la elección entre los diversos tipos de colecciones proporcionadas en el System.Collections.Generic namespace, tendrá que elegir la que tenga las características y características que mejor se adapten a sus necesidades específicas.

Si se dirige a una versión anterior de .NET Framework o necesita una clase de colección que implemente la interfaz IList<T>, deberá optar por la clase SynchronizedCollection<T>.

este artículo en MSDN es también vale la pena leer: When to Use a Thread-Safe Collection

+0

Entonces, puedo preferir System.Collections.Concurrent sobre SynchrinozedCollecction ya que estoy usando la versión 4.0 !! – Batrickparry

+1

Si estas nuevas colecciones simultáneas no usan bloqueos para seguridad de hilos, ¿cómo se logra la simultaneidad? – Matt

+2

@Matt: Varias maneras. La respuesta es probablemente lo suficientemente complicada como para merecer su propia pregunta. Pero para obtener inspiración, mira aquí: http://stackoverflow.com/questions/1688870/how-might-a-class-like-nets-concurrentbagt-be-implemented y aquí: http://stackoverflow.com/questions/4785622/why-is-concurrentbagt-so-slow-in-net-4-0-am-i-doing-it-wrong (También, ¿ha leído el artículo de MSDN al que me he vinculado? Se ofrece un resumen muy breve de la trucos que usan en lugar de bloquear, aunque probablemente no sean suficientes para escribir su propia implementación.) –

Cuestiones relacionadas