ICollection.SyncRoot, propriété (System.Collections)

Changer de vue:
ScriptFree
Bibliothèque de classes .NET Framework
ICollection.SyncRoot, propriété
Cet article a fait l'objet d'une traduction manuelle. Pour afficher simultanément cette page et le contenu source en anglais, choisissez le paramètre d'affichage Basse densité.

Obtient un objet qui peut être utilisé pour synchroniser l'accès à ICollection.

Espace de noms :  System.Collections
Assembly :  mscorlib (dans mscorlib.dll)
Syntaxe

Visual Basic
ReadOnly Property SyncRoot As Object
	Get
C#
Object SyncRoot { get; }
VisualC++
property Object^ SyncRoot {
	Object^ get ();
}
F#
abstract SyncRoot : Object

Valeur de propriété

Type : System.Object
Objet pouvant être utilisé pour synchroniser l'accès au ICollection.
Notes

Pour les collections dont le magasin sous-jacent n'est pas disponible publiquement, l'implémentation attendue consiste à retourner l'instance actuelle. Notez que le pointeur vers l'instance actuelle peut ne pas être suffisant pour les collections qui encapsulent d'autres collections ; ceux-là doivent retourner la propriété SyncRoot de la collection sous-jacente.

La plupart des classes de collection dans l'espace de noms System.Collections implémentent également une méthode Synchronized qui fournit un wrapper synchronisé autour de la collection sous-jacente. Toutefois, les classes dérivées peuvent fournir leur propre version synchronisée de la collection à l'aide de la propriété SyncRoot. Le code de synchronisation doit effectuer les opérations sur la propriété SyncRoot de la collection, et non directement sur la collection. Cela garantit un fonctionnement correct des collections dérivées d'autres objets. Plus particulièrement, la synchronisation est assurée avec les autres threads qui pourraient modifier simultanément l'instance de la collection.

En l'absence d'une méthode Synchronized sur une collection, l'utilisation attendue pour SyncRoot ressemble à ce qui suit :

Visual Basic

Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    ' Some operation on the collection, which is now thread safe.
End SyncLock


C#

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    // Some operation on the collection, which is now thread safe.
}


VisualC++

ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
    Monitor::Enter(myCollection->SyncRoot, lockTaken);
    // Some operation on the collection, which is now thread safe.
}
finally
{
    if (lockTaken)
    {
        Monitor::Exit(myCollection->SyncRoot);
    }
}


L'énumération d'une collection n'est intrinsèquement pas une procédure thread-safe. Même lorsqu'une collection est synchronisée, les autres threads peuvent toujours modifier la collection, ce qui entraîne la levée d'une exception par l'énumérateur. Pour garantir la sécurité des threads lors de l'énumération, vous pouvez verrouiller la collection pour toute la durée de l'énumération ou intercepter les exceptions résultant de modifications apportées par d'autres threads.

L'exemple de code suivant montre comment verrouiller la collection à l'aide de la propriété SyncRoot au cours de l'énumération entière.

Visual Basic

Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    For Each item In myCollection
        ' Insert your code here.
    Next item
End SyncLock


C#

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}


VisualC++

ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
    Monitor::Enter(myCollection->SyncRoot, lockTaken);
    for each (Object^ item in myCollection);
    {
        // Insert your code here.
    }
}
finally
{
    if (lockTaken)
    {
        Monitor::Exit(myCollection->SyncRoot);
    }
}


Informations de version

.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Pris en charge dans :
Plateformes

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Voir aussi

Référence