SchemaNameCollection.ICollection.SyncRoot Vlastnost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Získá objekt, který lze použít k synchronizaci přístupu k ICollection.
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
Hodnota vlastnosti
Objekt, který lze použít k synchronizaci přístupu k objektu ICollection.
Implementuje
Poznámky
U kolekcí s podkladovým úložištěm není veřejně dostupná, očekávaná implementace vrátí aktuální instanci. Všimněte si, že ukazatel na aktuální instanci nemusí být dostatečný pro kolekce, které zabalují jiné kolekce; ty by měly vrátit vlastnost podkladové kolekce SyncRoot .
Většina tříd kolekcí v System.Collections oboru názvů také implementuje metodu Synchronized , která poskytuje synchronizovanou obálku kolem podkladové kolekce. Odvozené třídy však mohou poskytovat vlastní synchronizovanou verzi kolekce pomocí SyncRoot vlastnosti. Synchronizační kód musí provádět operace SyncRoot s kolekcí, nikoli přímo v kolekci. Tím se zajistí správná operace kolekcí odvozených z jiných objektů. Konkrétně udržuje správnou synchronizaci s jinými vlákny, která mohou současně upravovat instanci kolekce.
Při absenci Synchronized metody v kolekci vypadá očekávané využití SyncRoot takto:
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
Výčet prostřednictvím kolekce není vnitřně bezpečným postupem pro přístup z více vláken. I když je kolekce synchronizována, ostatní vlákna mohou stále upravovat kolekci, což způsobí, že enumerátor vyvolá výjimku. Chcete-li zaručit bezpečnost vláken během výčtu, můžete buď uzamknout kolekci během celého výčtu, nebo zachytit výjimky vyplývající z změn provedených jinými vlákny.
Následující příklad ukazuje, jak uzamknout kolekci pomocí celého výčtu SyncRoot :
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