ICollection.SyncRoot Eigenschap

Definitie

Hiermee haalt u een object op dat kan worden gebruikt om de toegang tot het ICollectionobject te synchroniseren.

public:
 property System::Object ^ SyncRoot { System::Object ^ get(); };
public object SyncRoot { get; }
member this.SyncRoot : obj
Public ReadOnly Property SyncRoot As Object

Waarde van eigenschap

Een object dat kan worden gebruikt om de toegang tot de ICollection.

Opmerkingen

Voor verzamelingen waarvan de onderliggende opslag niet openbaar beschikbaar is, moet de verwachte implementatie het huidige exemplaar retourneren. Houd er rekening mee dat de aanwijzer naar het huidige exemplaar mogelijk niet voldoende is voor verzamelingen die andere verzamelingen verpakken; deze moeten de eigenschap van SyncRoot de onderliggende verzameling retourneren.

De meeste verzamelingsklassen in de System.Collections naamruimte implementeren ook een Synchronized methode, die een gesynchroniseerde wrapper rond de onderliggende verzameling biedt. Afgeleide klassen kunnen echter hun eigen gesynchroniseerde versie van de verzameling bieden met behulp van de SyncRoot eigenschap. De synchronisatiecode moet bewerkingen uitvoeren op de SyncRoot eigenschap van de verzameling, niet rechtstreeks op de verzameling. Dit zorgt voor de juiste werking van verzamelingen die zijn afgeleid van andere objecten. Het onderhoudt de juiste synchronisatie met andere threads die het verzamelingsexemplaren mogelijk tegelijkertijd wijzigen.

Als er geen Synchronized methode voor een verzameling is, ziet het verwachte gebruik SyncRoot er als volgt uit:

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

Het inventariseren via een verzameling is intrinsiek geen thread-veilige procedure. Zelfs wanneer een verzameling wordt gesynchroniseerd, kunnen andere threads de verzameling nog steeds wijzigen, waardoor de enumerator een uitzondering genereert. Om de veiligheid van threads tijdens de inventarisatie te garanderen, kunt u de verzameling vergrendelen tijdens de volledige inventarisatie of de uitzonderingen ondervangen die het gevolg zijn van wijzigingen die door andere threads zijn aangebracht.

In het volgende codevoorbeeld ziet u hoe u de verzameling vergrendelt met behulp van de SyncRoot eigenschap tijdens de volledige inventarisatie.

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    For Each item In myCollection
        ' Insert your code here.
    Next item
End SyncLock

Van toepassing op

Zie ook