Share via


Collections et synchronisation (sécurité des threads)

Mise à jour : novembre 2007

Par défaut, les classes dans System.Collections et les espaces de noms connexes ne sont pas thread-safe. Plusieurs lecteurs peuvent lire la collection en toute confiance ; cependant, toute modification apportée à la collection produit des résultats non définis pour tous les threads accédant à la collection, y compris les threads du lecteur.

Les classes System.Collections peuvent devenir thread-safe à l'aide d'une des méthodes suivantes :

  • Créez un wrapper thread-safe à l'aide de la méthode Synchronized et accédez à la collection exclusivement via ce wrapper.

  • Si la classe n'a pas de méthode Synchronized, dérivez de la classe et implémentez une méthode Synchronized à l'aide de la propriété SyncRoot.

  • Utilisez un mécanisme de verrouillage, tel que l'instruction lock en C#, (SyncLock dans Visual Basic, la classe Monitor en C++) sur la propriété SyncRoot lors de l'accès à la collection.

Lors de l'implémentation de la méthode Synchronized, les classes dérivées doivent remplacer la propriété IsReadOnly afin de retourner la valeur correcte.

La classe Array n'inclut pas de méthode Synchronized et, bien qu'elle ait une propriété SyncRoot, elle ne peut pas être à l'origine d'une dérivation. Par conséquent, un tableau peut être rendu thread-safe uniquement via le mécanisme de verrouillage.

Les classes de collections génériques n'incluent pas de membres de synchronisation ; toutefois, certaines classes génériques, telles que Collection<T>, Dictionary<TKey, TValue> et List<T>, implémentent explicitement des membres de synchronisation hérités de l'interface non générique ICollection.

Voir aussi

Référence

System.Collections

System.Collections.Specialized

System.Collections.Generic

Autres ressources

Création et manipulation de collections