Sdílet prostřednictvím


SchemaNameCollection.ICollection.SyncRoot Vlastnost

Definice

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

Kolekce s podkladovým úložištěm nejsou veřejně dostupné, očekávaná implementace vrátí aktuální instanci. Všimněte si, že ukazatel na aktuální instanci nemusí stačit pro kolekce, které zabalují jiné kolekce; ty by měly vrátit vlastnost podkladové kolekce SyncRoot .

Většina tříd kolekce 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 s SyncRoot kolekcí, nikoli přímo s kolekcí. Tím zajistíte správnou funkci kolekcí, které jsou odvozeny 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í pro SyncRoot následující:

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 nemůže být procedurou bezpečnou pro přístup z více vláken. I v případě, že jde o synchronizovanou kolekci, mohou úpravy provádět i ostatní vlákna, což způsobuje vyvolání výjimky enumerátorem. K zaručení bezpečnosti přístupu z více vláken můžete buďto zamknout kolekci na celou dobu práce s výčtem, nebo zachycovat výjimky vzniklé v důsledku změn prováděných ostatními vlákny.

Následující příklad ukazuje, jak uzamknout kolekci pomocí příkazu SyncRoot během celého výčtu:

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  

Platí pro

Viz také