Поделиться через


SchemaNameCollection.ICollection.SyncRoot Свойство

Определение

Получает объект, с помощью которого можно синхронизировать доступ к коллекции 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

Значение свойства

Объект, который может быть использован для синхронизации доступа к коллекции ICollection.

Реализации

Комментарии

Для коллекций с базовым хранилищем не является общедоступным, ожидаемая реализация — возврат текущего экземпляра. Обратите внимание, что указателя на текущий экземпляр может быть недостаточно для коллекций, которые переносят другие коллекции. они должны возвращать свойство базовой SyncRoot коллекции.

Большинство классов коллекций в пространстве имен System.Collections также реализуют метод Synchronized, который обеспечивает создание синхронизированной оболочки для коллекции. Однако производные классы могут предоставлять собственную синхронизированную версию коллекции с помощью свойства SyncRoot. Синхронизированный код должен выполнять операции SyncRoot с коллекцией, а не непосредственно с коллекцией. Это обеспечивает правильную работу коллекций, являющихся производными других объектов. В частности, это обеспечивает правильную синхронизацию с другими потоками, которые могут одновременно вносить изменения в экземпляр коллекции.

При отсутствии Synchronized метода в коллекции ожидаемое использование для SyncRoot выглядит следующим образом:

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  

Перечисление коллекции не является потокобезопасной процедурой. Даже если коллекция синхронизирована, другие потоки могут ее изменить, что приведет к тому, что перечислитель создаст исключение. Для обеспечения потокобезопасности при перечислении можно либо заблокировать коллекцию на все время перечисления, либо перехватывать исключения, возникающие в результате изменений, внесенных другими потоками.

В следующем примере показано, как заблокировать коллекцию с помощью SyncRoot во время всего перечисления:

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  

Применяется к

См. также раздел