Collections thread-safeThread-Safe Collections

.NET Framework 4 introduit l’espace de noms System.Collections.Concurrent, qui contient plusieurs classes de collection qui sont à la fois thread-safe et scalables.The .NET Framework 4 introduces the System.Collections.Concurrent namespace, which includes several collection classes that are both thread-safe and scalable. Plusieurs threads peuvent, sans risque et de façon efficace, ajouter ou supprimer des éléments dans ces collections, sans nécessiter une synchronisation supplémentaire dans le code utilisateur.Multiple threads can safely and efficiently add or remove items from these collections, without requiring additional synchronization in user code. Quand vous écrivez du code, utilisez des classes de collections simultanées si plusieurs threads écrivent en même temps dans la collection.When you write new code, use the concurrent collection classes whenever multiple threads will write to the collection concurrently. Si vous lisez seulement dans une collection partagée, vous pouvez utiliser les classes de l’espace de noms System.Collections.Generic.If you are only reading from a shared collection, then you can use the classes in the System.Collections.Generic namespace. Nous vous recommandons de ne pas utiliser les classes de collections 1.0, à moins que vous ne deviez cibler le runtime .NET Framework 1.1 ou une version antérieure.We recommend that you do not use 1.0 collection classes unless you are required to target the .NET Framework 1.1 or earlier runtime.

Synchronisation de threads dans les collections .NET Framework 1.0 et 2.0Thread Synchronization in the .NET Framework 1.0 and 2.0 Collections

Les collections introduites dans le .NET Framework 1.0 se trouvent dans l’espace de noms System.Collections.The collections introduced in the .NET Framework 1.0 are found in the System.Collections namespace. Ces collections, qui incluent les ArrayList et Hashtable fréquemment utilisés, garantissent une certaine cohérence des threads par le biais de la propriété Synchronized, qui retourne un wrapper thread-safe autour de la collection.These collections, which include the commonly used ArrayList and Hashtable, provide some thread-safety through the Synchronized property, which returns a thread-safe wrapper around the collection. Le wrapper fonctionne en verrouillant l’ensemble de la collection à chaque opération d’ajout ou de suppression.The wrapper works by locking the entire collection on every add or remove operation. Par conséquent, chaque thread qui tente d’accéder à la collection doit attendre son tour pour prendre le verrou.Therefore, each thread that is attempting to access the collection must wait for its turn to take the one lock. Ce fonctionnement n’est pas évolutif et peut provoquer une importante dégradation des performances pour les grandes collections.This is not scalable and can cause significant performance degradation for large collections. De même, la conception n’est pas complètement protégée contre la concurrence critique.Also, the design is not completely protected from race conditions. Pour plus d’informations, consultez Synchronisation dans les collections génériques.For more information, see Synchronization in Generic Collections.

Les classes de collection introduites dans le .NET Framework 2.0 se trouvent dans l’espace de noms System.Collections.Generic.The collection classes introduced in the .NET Framework 2.0 are found in the System.Collections.Generic namespace. Elles comprennent notamment List<T>, Dictionary<TKey,TValue>, etc.These include List<T>, Dictionary<TKey,TValue>, and so on. Ces classes garantissent une cohérence des types et des performances améliorées par rapport aux classes du .NET Framework 1.0.These classes provide improved type safety and performance compared to the .NET Framework 1.0 classes. Toutefois, les classes de collections .NET Framework 2.0 ne fournissent pas de synchronisation des threads. Le code utilisateur doit fournir toute la synchronisation quand des éléments sont ajoutés ou supprimés simultanément sur plusieurs threads.However, the .NET Framework 2.0 collection classes do not provide any thread synchronization; user code must provide all synchronization when items are added or removed on multiple threads concurrently.

Nous vous recommandons les classes de collections simultanées de .NET Framework 4, car elles offrent non seulement la cohérence des types des classes de collections .NET Framework 2.0, mais également une cohérence de thread plus efficace et plus complète que les collections .NET Framework 1.0.We recommend the concurrent collections classes in the .NET Framework 4 because they provide not only the type safety of the .NET Framework 2.0 collection classes, but also more efficient and more complete thread safety than the .NET Framework 1.0 collections provide.

Verrouillage de granularité fine et mécanismes sans verrouFine-Grained Locking and Lock-Free Mechanisms

Certains types de collections simultanées utilisent des mécanismes de synchronisation légers, comme SpinLock, SpinWait, SemaphoreSlim et CountdownEvent, qui sont nouveaux dans .NET Framework 4.Some of the concurrent collection types use lightweight synchronization mechanisms such as SpinLock, SpinWait, SemaphoreSlim, and CountdownEvent, which are new in the .NET Framework 4. Ces types de synchronisation utilisent généralement la rotation intensive pendant de courtes périodes avant de mettre le thread dans un véritable état d’attente.These synchronization types typically use busy spinning for brief periods before they put the thread into a true Wait state. Lorsque les temps d’attente sont supposés être très courts, la rotation est beaucoup moins gourmande en ressources informatiques que l’attente, qui implique une transition de noyau coûteuse.When wait times are expected to be very short, spinning is far less computationally expensive than waiting, which involves an expensive kernel transition. Pour les classes de collections qui utilisent la rotation, cette efficacité signifie que plusieurs threads peuvent ajouter et supprimer des éléments à un taux très élevé.For collection classes that use spinning, this efficiency means that multiple threads can add and remove items at a very high rate. Pour plus d'informations sur la rotation et le blocage, consultez SpinLock et SpinWait.For more information about spinning vs. blocking, see SpinLock and SpinWait.

Les classes ConcurrentQueue<T> et ConcurrentStack<T> n’utilisent pas de verrous du tout.The ConcurrentQueue<T> and ConcurrentStack<T> classes do not use locks at all. Au lieu de cela, elles s’appuient sur des opérations Interlocked pour assurer la cohérence des threads.Instead, they rely on Interlocked operations to achieve thread-safety.

Notes

Étant donné que les classes de collections simultanées prennent en charge ICollection, elles fournissent des implémentations pour les propriétés IsSynchronized et SyncRoot, bien que ces propriétés ne soient pas pertinentes.Because the concurrent collections classes support ICollection, they provide implementations for the IsSynchronized and SyncRoot properties, even though these properties are irrelevant. IsSynchronized retourne toujours false et SyncRoot a toujours la valeur null (Nothing dans Visual Basic).IsSynchronized always returns false and SyncRoot is always null (Nothing in Visual Basic).

Le tableau suivant répertorie les types de collections dans l’espace de noms System.Collections.Concurrent.The following table lists the collection types in the System.Collections.Concurrent namespace.

TypeType DescriptionDescription
BlockingCollection<T> Fournit des fonctionnalités de délimitation et de blocage pour tous les types qui implémentent IProducerConsumerCollection<T>.Provides bounding and blocking functionality for any type that implements IProducerConsumerCollection<T>. Pour plus d’informations, consultez Vue d’ensemble de BlockingCollection.For more information, see BlockingCollection Overview.
ConcurrentDictionary<TKey,TValue> Implémentation thread-safe d’un dictionnaire de paires clé-valeur.Thread-safe implementation of a dictionary of key-value pairs.
ConcurrentQueue<T> Implémentation thread-safe d’une file d’attente FIFO (premier entré, premier sorti).Thread-safe implementation of a FIFO (first-in, first-out) queue.
ConcurrentStack<T> Implémentation thread-safe d’une pile LIFO (dernier entré, premier sorti).Thread-safe implementation of a LIFO (last-in, first-out) stack.
ConcurrentBag<T> Implémentation thread-safe d’une collection non ordonnée d’éléments.Thread-safe implementation of an unordered collection of elements.
IProducerConsumerCollection<T> Interface qu’un type doit implémenter pour être utilisé dans un BlockingCollection.The interface that a type must implement to be used in a BlockingCollection.
TitreTitle DescriptionDescription
Vue d'ensemble de BlockingCollectionBlockingCollection Overview Décrit la fonctionnalité fournie par le type BlockingCollection<T>.Describes the functionality provided by the BlockingCollection<T> type.
Guide pratique pour ajouter et supprimer des éléments d'un ConcurrentDictionaryHow to: Add and Remove Items from a ConcurrentDictionary Décrit comment ajouter et supprimer des éléments dans un ConcurrentDictionary<TKey,TValue>.Describes how to add and remove elements from a ConcurrentDictionary<TKey,TValue>
Guide pratique pour ajouter et prendre des éléments individuellement dans un BlockingCollectionHow to: Add and Take Items Individually from a BlockingCollection Décrit comment ajouter et récupérer des éléments dans une collection de blocage sans utiliser l’énumérateur en lecture seule.Describes how to add and retrieve items from a blocking collection without using the read-only enumerator.
Guide pratique pour ajouter des fonctionnalités de délimitation et de blocage à une collectionHow to: Add Bounding and Blocking Functionality to a Collection Décrit comment utiliser une classe de collection comme mécanisme de stockage sous-jacent pour une collection IProducerConsumerCollection<T>.Describes how to use any collection class as the underlying storage mechanism for an IProducerConsumerCollection<T> collection.
Guide pratique pour utiliser la boucle ForEach pour supprimer les éléments d'un BlockingCollectionHow to: Use ForEach to Remove Items in a BlockingCollection Décrit comment utiliser foreach, (For Each dans Visual Basic) pour supprimer tous les éléments d’une collection de blocage.Describes how to use foreach, (For Each in Visual Basic) to remove all items in a blocking collection.
Guide pratique pour utiliser des tableaux de collections de blocage dans un pipelineHow to: Use Arrays of Blocking Collections in a Pipeline Décrit comment utiliser simultanément plusieurs collections de blocage pour implémenter un pipeline.Describes how to use multiple blocking collections at the same time to implement a pipeline.
Guide pratique pour créer un pool d'objets à l'aide d'un ConcurrentBagHow to: Create an Object Pool by Using a ConcurrentBag Montre comment utiliser un conteneur simultané pour améliorer les performances dans les scénarios où vous pouvez réutiliser des objets au lieu d’en créer continuellement de nouveaux.Shows how to use a concurrent bag to improve performance in scenarios where you can reuse objects instead of continually creating new ones.

RéférenceReference

System.Collections.Concurrent