SchemaNameCollection.ICollection.SyncRoot Właściwość
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Pobiera obiekt, który może służyć do synchronizowania dostępu do obiektu 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
Wartość właściwości
Obiekt, który może służyć do synchronizowania dostępu do obiektu ICollection.
Implementuje
Uwagi
W przypadku kolekcji z bazowym magazynem nie jest publicznie dostępna, oczekiwana implementacja ma zwrócić 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 zawijają inne kolekcje; 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. Jednak klasy pochodne mogą zapewnić własną zsynchronizowaną wersję kolekcji przy użyciu SyncRoot właściwości . Synchronizowanie kodu musi wykonywać operacje na SyncRoot 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 prawidłową synchronizację z innymi wątkami, które mogą być jednocześnie modyfikowane w wystąpieniu kolekcji.
W przypadku braku Synchronized
metody w kolekcji oczekiwane użycie wygląda SyncRoot następująco:
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
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.
W poniższym przykładzie pokazano, jak zablokować kolekcję przy użyciu SyncRoot elementu w trakcie całego wyliczenia:
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