Coleções Thread-Safe
O .NET Framework 4 introduz o espaço de System.Collections.Concurrent nome, que inclui várias classes de coleção que são tanto seguras como escaláveis. Várias linhas podem adicionar ou remover itens de forma segura e eficiente destas coleções, sem necessitar de sincronização adicional no código do utilizador. Quando escrever um novo código, utilize as aulas de recolha simultânea sempre que vários fios escreverem para a coleção simultaneamente. Se você está apenas lendo de uma coleção partilhada, então você pode usar as aulas no espaço de System.Collections.Generic nomes. Recomendamos que não utilize 1.0 aulas de recolha a menos que seja obrigado a direcionar a .NET Framework 1.1 ou tempo de execução mais cedo.
Sincronização de fios nas coleções .NET Framework 1.0 e 2.0
As coleções introduzidas no .NET Framework 1.0 encontram-se no espaço de System.Collections nomes. Estas coleções, que incluem a mais utilizada ArrayList e Hashtable, fornecem alguma segurança através da Synchronized
propriedade, que devolve um invólucro em torno da coleção. O invólucro funciona bloqueando toda a coleção em cada adição ou remoção de operação. Por isso, cada fio que está a tentar aceder à coleção deve aguardar a sua vez de pegar no único cadeado. Isto não é escalável e pode causar uma degradação significativa do desempenho para grandes coleções. Além disso, o design não está completamente protegido das condições de corrida. Para mais informações, consulte a Sincronização em Coleções Genéricas.
As aulas de recolha introduzidas no .NET Framework 2.0 encontram-se no espaço de System.Collections.Generic nomes. Estes incluem List<T>, Dictionary<TKey,TValue>e assim por diante. Estas aulas proporcionam uma melhor segurança e desempenho do tipo em comparação com as aulas .NET Framework 1.0. No entanto, as classes de recolha .NET Framework 2.0 não fornecem qualquer sincronização de fios; o código do utilizador deve fornecer toda a sincronização quando os itens são adicionados ou removidos em várias linhas simultaneamente.
Recomendamos as aulas de coleções simultâneas no .NET Framework 4 porque fornecem não só a segurança tipo das classes de recolha .NET Framework 2.0, mas também a segurança dos fios mais eficiente e completa do que as coleções .NET Framework 1.0 proporcionam.
Mecanismos de bloqueio e Lock-Free Fine-Grained
Alguns dos tipos de recolha simultânea utilizam mecanismos de sincronização leves comoSpinLock, SemaphoreSlimSpinWaiteCountdownEvent, são novos no .NET Framework 4. Estes tipos de sincronização normalmente usam a rotação ocupada por breves períodos antes de colocarem o fio num verdadeiro estado de espera. Quando se espera que os tempos de espera sejam muito curtos, a rotação é muito menos computacionalmente cara do que a espera, o que implica uma transição de núcleo caro. Para as classes de recolha que usam fiação, esta eficiência significa que vários fios podem adicionar e remover itens a uma taxa muito elevada. Para obter mais informações sobre o spinning vs. bloqueio, consulte SpinLock e SpinWait.
As ConcurrentQueue<T> classes e ConcurrentStack<T> as classes não usam fechaduras. Em vez disso, confiam em Interlocked operações para alcançar a segurança dos fios.
Nota
Como as coleções simultâneas suportam ICollection, fornecem implementações para os IsSynchronized imóveis, SyncRoot mesmo que estas propriedades sejam irrelevantes. IsSynchronized
sempre retorna false
e SyncRoot
é sempre null
(Nothing
em Visual Basic).
A tabela que se segue lista os tipos de recolha no espaço de System.Collections.Concurrent nomes.
Tipo | Description |
---|---|
BlockingCollection<T> | Fornece funcionalidade de limitação e bloqueio para qualquer tipo que implemente IProducerConsumerCollection<T>. Para mais informações, consulte a visão geral da BlockingCollection. |
ConcurrentDictionary<TKey,TValue> | Implementação segura de um dicionário de pares de valores-chave. |
ConcurrentQueue<T> | Implementação segura de um FIFO (primeiro a entrar, primeiro a sair). |
ConcurrentStack<T> | Implementação segura de um empilhador LIFO (último a entrar, primeiro a sair). |
ConcurrentBag<T> | Implementação segura de uma coleção de elementos não ordenados. |
IProducerConsumerCollection<T> | A interface que um tipo deve implementar para ser utilizada num BlockingCollection . |
Tópicos relacionados
Título | Descrição |
---|---|
Visão geral dacolecção de bloqueio | Descreve a funcionalidade fornecida pelo BlockingCollection<T> tipo. |
Como: Adicionar e remover itens de uma Consecância | Descreve como adicionar e remover elementos de um ConcurrentDictionary<TKey,TValue> |
Como: Adicionar e Levar itens individualmente a partir de uma BlockingCollection | Descreve como adicionar e recuperar itens de uma coleção de bloqueio sem usar o enumerador apenas de leitura. |
Como: Adicionar a funcionalidade de limite 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: Use ForEach para remover itens numa BlockingCollection | Descreve como usar foreach , (For Each em Visual Basic) para remover todos os itens numa coleção de bloqueio. |
Como: Usar matrizes de coleções de bloqueio num oleoduto | Descreve como usar várias coleções de bloqueio ao mesmo tempo para implementar um oleoduto. |
Como: Criar uma piscina de objetos usando um Saco Simultâneo | Mostra como usar um saco simultâneo para melhorar o desempenho em cenários onde pode reutilizar objetos em vez de criar continuamente novos. |