ICollection.SyncRoot Eigenschaft

Definition

Ruft ein Objekt ab, mit dem der Zugriff auf ICollection synchronisiert werden kann.

public:
 property System::Object ^ SyncRoot { System::Object ^ get(); };
public object SyncRoot { get; }
member this.SyncRoot : obj
Public ReadOnly Property SyncRoot As Object

Eigenschaftswert

Ein Objekt, mit dem der Zugriff auf ICollection synchronisiert werden kann.

Hinweise

Bei Auflistungen, die einen nicht öffentlich verfügbaren Speicher verwenden, besteht die erwartete Implementierung in der Rückgabe der aktuellen Instanz. Beachten Sie, dass der Zeiger auf die aktuelle Instanz für Sammlungen, die andere Sammlungen umschließen, möglicherweise nicht ausreicht. diese sollten die -Eigenschaft der SyncRoot zugrunde liegenden Auflistung zurückgeben.

Die meisten Auflistungsklassen im System.Collections-Namespace implementieren darüber hinaus eine Synchronized-Methode, die einen synchronisierten Wrapper um die zugrunde liegende Auflistung zur Verfügung stellt. Abgeleitete Klassen können jedoch mithilfe der SyncRoot-Eigenschaft eine eigene synchronisierte Version der Auflistung bereitstellen. Im Synchronisierungscode dürfen Vorgänge nicht direkt für die Auflistung ausgeführt werden. Stattdessen müssen sie für die SyncRoot-Eigenschaft der Auflistung ausgeführt werden. Dies gewährleistet die einwandfreie Funktion von Auflistungen, die von anderen Objekten abgeleitet sind. Im Besonderen wird die ordnungsgemäße Synchronisierung mit anderen Threads gewährleistet, die eventuell zur gleichen Zeit Änderungen an der Auflistungsinstanz vornehmen.

Wenn keine Synchronized Methode für eine Auflistung vorhanden ist, sieht die erwartete Verwendung für SyncRoot wie folgt aus:

ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
    Monitor::Enter(myCollection->SyncRoot, lockTaken);
    // Some operation on the collection, which is now thread safe.
}
finally
{
    if (lockTaken)
    {
        Monitor::Exit(myCollection->SyncRoot);
    }
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    // Some operation on the collection, which is now thread safe.
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    ' Some operation on the collection, which is now thread safe.
End SyncLock

Die Enumeration einer Auflistung ist systemintern keine threadsichere Prozedur. Selbst wenn eine Auflistung synchronisiert wird, besteht die Möglichkeit, dass andere Threads sie ändern. Dies führt dazu, dass der Enumerator eine Ausnahme auslöst. Um während der Enumeration Threadsicherheit zu gewährleisten, können Sie entweder die Auflistung während der gesamten Enumeration sperren oder die Ausnahmen, die aus von anderen Threads stammenden Änderungen resultieren, abfangen.

Im folgenden Codebeispiel wird gezeigt, wie die Auflistung während der gesamten Enumeration mit der SyncRoot -Eigenschaft gesperrt wird.

ICollection^ myCollection = someCollection;
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);
    }
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    For Each item In myCollection
        ' Insert your code here.
    Next item
End SyncLock

Gilt für:

Weitere Informationen