SearchResultCollection.ICollection.SyncRoot Eigenschap
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
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