Udostępnij za pośrednictwem


ICollection.SyncRoot Właściwość

Definicja

Pobiera obiekt, który może służyć do synchronizowania dostępu do obiektu ICollection.

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

Wartość właściwości

Obiekt, który może służyć do synchronizowania dostępu do obiektu ICollection.

Uwagi

W przypadku kolekcji, których bazowy magazyn nie jest publicznie dostępny, oczekiwana implementacja zwraca bieżące wystąpienie. Należy pamiętać, że wskaźnik do bieżącego wystąpienia może nie być wystarczający dla kolekcji, które opakowują inne kolekcje; te powinny zwracać właściwość kolekcji bazowej SyncRoot .

Większość klas kolekcji w System.Collections przestrzeni nazw implementuje również metodę Synchronized , która zapewnia zsynchronizowaną otokę wokół bazowej kolekcji. Klasy pochodne mogą jednak zapewnić własną zsynchronizowaną wersję kolekcji przy użyciu SyncRoot właściwości . Synchronizowanie kodu musi wykonywać operacje na SyncRoot właściwości kolekcji, a nie bezpośrednio w kolekcji. Gwarantuje to prawidłowe funkcjonowanie kolekcji, które są uzyskiwane z innych obiektów. W szczególności utrzymuje właściwą synchronizację z innymi wątkami, które mogą jednocześnie modyfikować wystąpienie kolekcji.

W przypadku braku Synchronized metody w kolekcji oczekiwane użycie wygląda SyncRoot następująco:

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

Wyliczanie w kolekcji nie jest wewnętrznie procedurą odporną na wielowątkowość. Nawet gdy kolekcja jest synchronizowana, inne wątki nadal mogą ją modyfikować. Powoduje to zgłaszanie wyjątku przez moduł wyliczający. Aby zagwarantować bezpieczeństwo wątków podczas wyliczania, można zablokować kolekcję podczas całego procesu wyliczania albo rejestrować wyjątki wynikłe ze zmian wprowadzanych przez inne wątków.

Poniższy przykład kodu pokazuje, jak zablokować kolekcję przy użyciu SyncRoot właściwości podczas całego wyliczenia.

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

Dotyczy

Zobacz też