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 |
---|---|
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. |
|
Thread-safe a implementação de um dicionário de pares chave-valor. |
|
Implementação de thread-safe de uma fila FIFO (first in, First). |
|
Thread-safe a implementação de uma pilha de UEPS (último-in, First). |
|
Implementação de thread-safe de uma coleção não-ordenada de elementos. |
|
A interface de um tipo deve implementar a ser usado em um BlockingCollection. |
Tópicos relacionados
Título |
Descrição |
---|---|
Descreve a funcionalidade fornecida pelo BlockingCollection<T> tipo. |
|
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. |
Descreve como usar vários conjuntos de bloqueio ao mesmo tempo para implementar um pipeline. |
|
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. |