NameObjectCollectionBase.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 objektu NameObjectCollectionBase .
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 NameObjectCollectionBase .
Implementuje
Poznámky
Odvozené třídy mohou poskytovat vlastní synchronizovanou verzi NameObjectCollectionBase třídy pomocí SyncRoot vlastnosti . Synchronizační kód musí provádět operace s SyncRoot vlastností objektu NameObjectCollectionBase , nikoli přímo s objektem NameObjectCollectionBase . 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á můžou současně upravovat NameObjectCollectionBase objekt.
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 kódu ukazuje, jak zamknout kolekci SyncRoot pomocí příkazu během celého výčtu.
// Create a collection derived from NameObjectCollectionBase
ICollection^ myCollection = gcnew DerivedCollection();
bool lockTaken = false;
try
{
Monitor::Enter(myCollection->SyncRoot, lockTaken);
for each (Object^ item in myCollection)
{
// Insert your code here.
}
}
finally
{
if (lockTaken)
{
Monitor::Exit(myCollection->SyncRoot);
}
}
// Create a collection derived from NameObjectCollectionBase
ICollection myCollection = new DerivedCollection();
lock(myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}
' Create a collection derived from NameObjectCollectionBase
Dim myCollection As ICollection = New DerivedCollection()
SyncLock myCollection.SyncRoot
For Each item As Object In myCollection
' Insert your code here.
Next item
End SyncLock
Načtení hodnoty této vlastnosti je operace O(1).