Coleções introduzidas no .NET Framework 1.0 podem ser encontradas no namespace System.Collections. Essas coleções, incluindo as comumente usadas ArrayList e Hashtable, fornecem algum tipo de segurança de threads por meio da propriedade Synchronized, que retorna um wrapper thread-safe relacionado à coleção. O wrapper funciona bloqueando todo o conjunto para cada operação de adição ou remoção. Portanto, cada thread que tenta acessar a coleção deve esperar até sua vez de adquirir o bloqueio. Isso não é escalável e resultará em uma degradação significativa de desempenho para coleções grandes. Além disso, esse design não impede completamente a disputa. Para mais informações, veja a página a seguir no site da MSDN: Sincronização em Coleções Genéricas
A classe de coleção introduzida no .NET Framework 2.0 pode ser encontrada no namespace System.Collections.Generic. Essas classes de coleção incluem Lista<T>, Dicionário< TKey, TValue> etc. Essas classes oferecem maior segurança de tipos e desempenho em comparação com as classes do .NET Framework 1.0. No entanto, a classe de coleção .NET Framework 2.0 não oferece nenhuma sincronização de threads; Ao adicionar ou remover itens em múltiplas threads ao mesmo tempo, o código do usuário deve fornecer toda a sincronização.
Recomendamos que você use classes de coleção concorrentes no .NET Framework 4, pois elas oferecem não apenas a segurança de tipos das classes de coleção do .NET Framework 2.0, mas também uma segurança de threads mais eficiente e completa do que a segurança de threads fornecida pela coleção .NET Framework 1.0.
Alguns tipos de coleções concorrentes utilizam mecanismos leves de sincronização, como SpinLock, SpinWait, SemaphoreSlim e CountdownEvent, que são novos no .NET Framework 4. Normalmente, os tipos de sincronização acima usam "giro ocupado" por um curto período de tempo antes de colocar a thread no estado real de espera. Se o tempo de espera for esperado para ser muito curto, o spin consumirá muito menos recursos de computação do que a espera, o que envolve conversões de kernel que consumirão muitos recursos. Para classes de coleção que usam rotação, essa eficiência significa que múltiplas threads conseguem adicionar e remover itens em uma taxa muito rápida. Para mais informações sobre limitação e bloqueio, veja SpinLock e SpinWait. As classes ConcurrentQueue<T> e ConcurrentStack<T> não usam locks de forma alguma. Em vez disso, eles dependem das operações Intertravadas para a segurança das threads.
ilustrar
Como classes de coleção concorrentes suportam ICollection, elas fornecem implementações para as propriedades IsSynchronized e SyncRoot, mesmo que não estejam relacionadas. IsSynchronized sempre retorna falso, enquanto SyncRoot é sempre nulo (Nada no Visual Basic).
A tabela a seguir lista os tipos de coleções no namespace System.Collections.Concurrent.
tipo | descrição | BlockingCollection<T> | Fornece<T> qualquer tipo de limitação e bloqueio para implementar o IProducerConsumerCollection. Para mais informações, veja a visão geral do BlockingCollection. | DicionárioConcurrente<TKey, TValue> | Key/value é uma implementação segura para threads do dicionário. | ConcurrentQueue<T> | Implementação de segurança de threads das filas FIFO (primeiro a entrar, primeiro a sair). | ConcurrentStack<T> | Implementação segura para threads de pilhas LIFO (last-in, first-out). | ConcurrentBag<T> | Implementação segura para threads de uma coleção de elementos fora de ordem. | IProducerConsumerCollection<T> | Os tipos devem ser implementados emBlockingCollectionInterfaces usadas na
|
|