Obtient un objet qui peut être utilisé pour synchroniser l'accès à ICollection.
Assembly : mscorlib (dans mscorlib.dll)
ReadOnly Property SyncRoot As Object Get
Object SyncRoot { get; }
property Object^ SyncRoot {
Object^ get ();
}
abstract SyncRoot : Object
Valeur de propriété
Type : System.ObjectObjet pouvant être utilisé pour synchroniser l'accès au ICollection.
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 :
Dim myCollection As ICollection = someCollection SyncLock myCollection.SyncRoot ' Some operation on the collection, which is now thread safe. End SyncLock
ICollection myCollection = someCollection; lock(myCollection.SyncRoot) { // Some operation on the collection, which is now thread safe. }
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.
Dim myCollection As ICollection = someCollection SyncLock myCollection.SyncRoot For Each item In myCollection ' Insert your code here. Next item End SyncLock
ICollection myCollection = someCollection; lock(myCollection.SyncRoot) { foreach (object item in myCollection) { // Insert your code here. } }
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); } }
.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 SP1Pris en charge dans :
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.