Compartilhar via


Coleções de thread-Safe.

O .NET Framework 4 apresenta o System.Collections.Concurrent namespace, que inclui várias classes de coleção são thread-safe e dimensionável. Vários threads podem com segurança e eficientemente adicionar ou remover itens dessas coleções, sem a necessidade de sincronização adicionais no código do usuário. Quando você escrever código novo, use as classes de coleção simultâneas, sempre que a coleção será gravado vários threads simultaneamente. Se você estiver apenas ler a partir de uma coleção compartilhada, você pode usar as classes de System.Collections.Generic namespace. Recomendamos que você faça não classes de coleção 1.0 uso a menos que seja necessário para o destino do.NET Framework 1.1 ou anterior em tempo de execução.

Sincronização de thread a.Coleções de NET Framework 1.0 e 2.0

As coleções são introduzidos na.NET Framework 1.0 são encontrados na System.Collections namespace. Essas coleções, que incluem comumente usados ArrayList e Hashtable, fornecer alguma segurança do segmento por meio de Synchronized propriedade, que retorna um wrapper thread-safe coleção. O wrapper funciona por toda a coleção de bloqueio em cada operação de adicionar ou remover. Portanto, cada thread que está tentando acessar a coleção deve aguardar sua vez para levar a um bloqueio. Isso não é escalável e pode causar degradação de desempenho significativos para grandes coleções. Além disso, o design não é totalmente protegido contra as condições de corrida. Para obter mais informações, consulte a sincronização em coleções genéricas no site do MSDN.

As classes de coleção introduzido na.NET Framework 2.0 são encontrados na System.Collections.Generic namespace. Esses incluem List<T>, Dictionary<TKey, TValue>e assim por diante. Essas classes fornecem o melhor tipo de segurança e desempenho em comparação com o.NET Framework 1.0 classes. No entanto, o.Classes de coleção do NET Framework 2.0 não oferecem qualquer sincronização de threads; o código de usuário deve fornecer toda a sincronização quando itens são adicionados ou removidos em diversos threads simultaneamente.

Recomendamos que as classes de coleções simultâneas na .NET Framework 4 porque eles fornecem não apenas a segurança de tipos da.Classes de coleção do NET Framework 2.0, mas também mais eficiente e mais completa segurança do thread que o .NET Framework 1.0 coleções.

Bloqueio refinado e mecanismos sem bloqueio

Alguns dos tipos de coleção simultâneas usam mecanismos de sincronização leves como SpinLock, SpinWait, SemaphoreSlim, e CountdownEvent, que são novos na .NET Framework 4. Esses tipos de sincronização geralmente usam ocupado girando por breves períodos antes que eles colocam o segmento em um estado de espera de true. Quando os tempos de espera deverão estar muito curto, girando é muito menos dispendioso de esperar, o que envolve uma transição de kernel caro. Para classes de coleção usam girando, essa eficiência significa que vários threads podem adicionar e remover itens em uma taxa muito alta. Para obter mais informações sobre girando vs. o bloqueio, consulte SpinLock e SpinWait.

O ConcurrentQueue<T> e ConcurrentStack<T> classes não utilizam bloqueios. Em vez disso, eles usam Interlocked operações para alcançar o thread-safety.

Observação

Porque as classes de coleções simultâneas suportam ICollection, eles fornecem implementações para o IsSynchronized e SyncRoot Propriedades, mesmo que essas propriedades são irrelevantes.IsSynchronizedsempre retorna false e SyncRoot é sempre null (Nothing em Visual Basic).

A tabela a seguir lista os tipos de coleção no System.Collections.Concurrent namespace.

Tipo

Descrição

BlockingCollection<T>

Fornece delimitadora e para qualquer tipo que implementa a funcionalidade de bloqueio IProducerConsumerCollection<T>. Para obter mais informações, consulte Visão geral do BlockingCollection.

ConcurrentDictionary<TKey, TValue>

Thread-safe a implementação de um dicionário de pares chave-valor.

ConcurrentQueue<T>

Implementação de thread-safe de uma fila FIFO (first in, First).

ConcurrentStack<T>

Thread-safe a implementação de uma pilha de UEPS (último-in, First).

ConcurrentBag<T>

Implementação de thread-safe de uma coleção não-ordenada de elementos.

IProducerConsumerCollection<T>

A interface de um tipo deve implementar a ser usado em um BlockingCollection.

Tópicos relacionados

Título

Descrição

Visão geral do BlockingCollection

Descreve a funcionalidade fornecida pelo BlockingCollection<T> tipo.

Como: Adicionar e remover itens de um ConcurrentDictionary

Descreve como adicionar e remover elementos de umConcurrentDictionary<TKey, TValue>

Como: Adicionar e levar os itens individualmente a partir de um BlockingCollection

Descreve como adicionar e recuperar os itens de uma coleção de bloqueio sem usar o enumerador de somente leitura.

Como: Adicionar delimitadora e a funcionalidade de uma classe de coleção de bloqueio

Descreve como usar qualquer classe de coleção como o mecanismo de armazenamento subjacente de um IProducerConsumerCollection<T> coleção.

Como: Usar o ForEach para remover os itens em um BlockingCollection

Descreve como usar foreach, (For Each em Visual Basic) para remover todos os itens em uma coleção de bloqueio.

Como: Usar matrizes de bloqueio de coleções em um Pipeline

Descreve como usar vários conjuntos de bloqueio ao mesmo tempo para implementar um pipeline.

Como: Criar um Pool de objetos usando um ConcurrentBag

Mostra como usar uma sacola simultânea para melhorar o desempenho em cenários onde você pode reutilizar objetos em vez de continuamente, criar novos.

Referência

System.Collections.Concurrent