Las colecciones introducidas en .NET Framework 1.0 pueden encontrarse en el espacio de nombres System.Collections. Estas colecciones, incluyendo las más usadas ArrayList y Hashtable, proporcionan algún tipo de seguridad de hilos a través de la propiedad Synchronized, que devuelve un envoltorio seguro para hilos relacionado con la colección. El envoltorio funciona bloqueando todo el conjunto para cada operación de añadir o eliminar. Por lo tanto, cada hilo que intenta acceder a la colección debe esperar hasta que sea su turno para adquirir el bloqueo. Esto no es escalable y resultará en una degradación significativa del rendimiento para colecciones grandes. Además, este diseño no impide completamente la controversia. Para más información, consulte la siguiente página en la web de MSDN: Sincronización en colecciones genéricas
La clase de colección introducida en .NET Framework 2.0 puede encontrarse en el espacio de nombres System.Collections.Generic. Estas clases de colección incluyen Lista<T>, Diccionario< TKey, TValue> etc. Estas clases proporcionan mayor seguridad de tipos y rendimiento en comparación con las clases de .NET Framework 1.0. Sin embargo, la clase de colección .NET Framework 2.0 no proporciona ninguna sincronización de hilos; Al añadir o eliminar elementos en varios hilos al mismo tiempo, el código de usuario debe proporcionar toda la sincronización.
Recomendamos que utilicen clases de colección concurrente en .NET Framework 4 porque proporcionan no solo la seguridad de tipos de las clases de colección de .NET Framework 2.0, sino también una seguridad de hilos más eficiente y completa que la de la colección .NET Framework 1.0.
Algunos tipos de colecciones concurrentes utilizan mecanismos ligeros de sincronización como SpinLock, SpinWait, SemaphoreSlim y CountdownEvent, que son nuevos en el .NET Framework 4. Normalmente, los tipos de sincronización anteriores usan el "activo de girar" durante un corto periodo de tiempo antes de poner el hilo en estado de espera real. Si se espera que el tiempo de espera sea muy corto, el spin consumirá muchos menos recursos de cómputo que la espera, lo que implica conversiones de kernel que consumirán muchos recursos. Para las clases de colección que usan rotación, esta eficiencia significa que múltiples hilos pueden añadir y eliminar elementos a un ritmo muy rápido. Para más información sobre limitar y bloquear, véase SpinLock y SpinWait. Las clases ConcurrentQueue<T> y ConcurrentStack<T> no usan bloqueos en absoluto. En su lugar, dependen de operaciones Interlocked para la seguridad en los hilos.
ilustrar
Debido a que las clases de colección concurrentes soportan ICollection, proporcionan implementaciones para las propiedades IsSynchronized y SyncRoot, incluso si no están relacionadas. IsSynchronized siempre devuelve false, mientras que SyncRoot siempre es nulo (nada en Visual Basic).
La siguiente tabla enumera los tipos de colecciones en el espacio de nombres System.Collections.Concurrent.
tipo | descripción | Colección <T>de Bloqueo | Proporciona<T> cualquier tipo de limitación y bloqueo para implementar IProducerConsumerCollection. Para más información, consulta la visión general de BlockingCollection. | ConcurrentDictionary<TKey, TValue> | Key/value es una implementación segura de hilos del diccionario. | ConcurrentQueue<T> | Implementación de seguridad de hilos de las colas FIFO (primero en entrar, primero en salir). | ConcurrentStack<T> | Implementación segura de hilos de pilas LIFO (last-in, first-out). | ConcurrentBag<T> | Implementación segura de hilos de una colección de elementos fuera de orden. | IProducerConsumerCollection<T> | los tipos deben implementarse enColección de BloqueoInterfaces utilizadas en el
|
|