SearchResultCollection.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

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

Object

Объект, который может быть использован для синхронизации доступа к коллекции 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  

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

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