Číst v angličtině

Sdílet prostřednictvím


ICollection.SyncRoot Vlastnost

Definice

Získá objekt, který lze použít k synchronizaci přístupu k .ICollection

public object SyncRoot { get; }

Hodnota vlastnosti

Objekt, který lze použít k synchronizaci přístupu k objektu ICollection.

Poznámky

U kolekcí, jejichž základní úložiště není veřejně dostupné, je očekávaná implementace vrátit 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 vlastností kolekce, 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 pro kolekci vypadá očekávané využití SyncRoot takto:

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    // Some operation on the collection, which is now thread safe.
}

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 uzamknout kolekci SyncRoot pomocí vlastnosti během celého výčtu.

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}

Platí pro

Produkt Verze
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Viz také