Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O System.Collections.Concurrent namespace inclui várias classes de coleção que são thread-safe e escaláveis. Vários threads podem adicionar ou remover itens dessas coleções com segurança e eficiência, sem exigir sincronização adicional no código do usuário. Quando escreves um novo código, usa as classes de coleção simultâneas para gerir vários threads na coleção de forma simultânea. Se você estiver lendo apenas de uma coleção compartilhada, poderá usar as classes no System.Collections.Generic namespace.
System.Collections e System.Collections.Generic
As classes de coleção no System.Collections namespace incluem ArrayList e Hashtable. Essas classes fornecem uma certa segurança de thread através da propriedade Synchronized
, que retorna um wrapper thread-safe em torno da coleção. O invólucro funciona bloqueando toda a coleção em cada operação de adição ou remoção. Portanto, cada thread que está tentando acessar a coleção deve esperar sua vez para tomar o único bloqueio. Esse processo não é escalável e pode causar uma degradação significativa do desempenho de grandes coleções. Além disso, o design não está protegido das condições de corrida. Para obter mais informações, consulte Sincronização em coleções genéricas.
As classes de coleção no System.Collections.Generic namespace incluem List<T> e Dictionary<TKey,TValue>. Estas classes proporcionam maior segurança do tipo e performance em comparação com as classes System.Collections. No entanto, as System.Collections.Generic classes não fornecem nenhuma sincronização de threads. O código do usuário deve fornecer toda a sincronização quando os itens são adicionados ou removidos em vários threads simultaneamente.
Recomendamos o uso das classes de coleções simultâneas no System.Collections.Concurrent namespace porque elas fornecem segurança de tipo e também segurança de thread mais eficiente e completa.
Mecanismos de bloqueio de grão fino e sem bloqueio
Alguns dos tipos de coleção simultânea usam mecanismos de sincronização leves, como SpinLock, SpinWait, SemaphoreSlime CountdownEvent. Esses tipos de sincronização normalmente usam rotação ocupada por breves períodos antes de colocar o thread em um estado verdadeiro Wait
. Quando se espera que os tempos de espera sejam curtos, girar é muito menos caro computacionalmente do que esperar, o que envolve uma transição cara do kernel. Para classes de coleção que usam rotação, essa eficiência significa que vários threads podem adicionar e remover itens a uma taxa alta. Para obter mais informações sobre rotação versus bloqueio, consulte SpinLock e SpinWait.
As ConcurrentQueue<T> classes e ConcurrentStack<T> não usam fechaduras. Em vez disso, eles dependem de Interlocked operações para alcançar a segurança da rosca.
Observação
Como as classes de coleções simultâneas oferecem suporte a ICollection, elas fornecem implementações para as propriedades IsSynchronized e SyncRoot, mesmo que essas propriedades sejam irrelevantes.
IsSynchronized
sempre retorna false
e, SyncRoot
é sempre null
(Nothing
no Visual Basic).
Tabela seguinte lista os tipos de coleção no namespace System.Collections.Concurrent.
Tipo | Descrição |
---|---|
BlockingCollection<T> | Fornece funcionalidades de limite e bloqueio para qualquer tipo que implemente IProducerConsumerCollection<T>. Para obter mais informações, consulte Visão geral de BlockingCollection. |
ConcurrentDictionary<TKey,TValue> | Implementação thread-safe de um dicionário de pares chave-valor. |
ConcurrentQueue<T> | Implementação thread-safe de uma fila FIFO (first-in, first-out). |
ConcurrentStack<T> | Implementação thread-safe de uma pilha LIFO (last-in, first-out). |
ConcurrentBag<T> | Implementação thread-safe de uma coleção não ordenada de elementos. |
IProducerConsumerCollection<T> | A interface que um tipo deve implementar para ser usada em um BlockingCollection . |
Artigos relacionados
Título | Descrição |
---|---|
Visão geral de BlockingCollection | Descreve a funcionalidade fornecida pelo BlockingCollection<T> tipo. |
Como: Adicionar e remover itens de um ConcurrentDictionary | Descreve como adicionar e remover elementos de um ConcurrentDictionary<TKey,TValue> |
Como Adicionar e Remover Itens Individualmente de um BlockingCollection | Descreve como adicionar e recuperar itens de uma coleção bloqueante sem usar o enumerador readonly. |
Como: Adicionar funcionalidade de delimitação e bloqueio a uma coleção | Descreve como usar qualquer classe de coleção como o mecanismo de armazenamento subjacente para uma IProducerConsumerCollection<T> coleção. |
Como usar ForEach para remover itens num BlockingCollection | Descreve como usar foreach (For Each no Visual Basic) para remover todos os itens em uma coleção de bloqueio. |
Como utilizar arrays de coleções de bloqueio num pipeline | Descreve como usar várias coleções de bloqueio ao mesmo tempo para implementar um pipeline. |
Como: Criar um pool de objetos usando um ConcurrentBag | Mostra como usar um saco simultâneo para melhorar o desempenho em cenários onde você pode reutilizar objetos em vez de criar continuamente novos. |