Partilhar via


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. IsSynchronizedsempre retorna false e SyncRoot é sempre null (Nothingem 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í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 Eachem 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.

Referência

System.Collections.Concurrent