SearchResultCollection.ICollection.SyncRoot Eigenschap

Definitie

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

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

Waarde van eigenschap

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

Implementeringen

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 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 =...
 lock(MyCollection.SyncRoot) {
  // Some operation on the collection, which is now thread safe.
 }
Dim myCollection as New ICollection()
 SyncLock myCollection.SyncRoot
  ' Some operation on the collection, which is now thread safe.
 End SyncLock

Het inventariseren via een verzameling is intrinsiek geen threadveilige 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 SyncRoot de volledige opsomming:

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

Van toepassing op

Zie ook