다음을 통해 공유


PropertyCollection.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에 대한 액세스를 동기화하는 데 사용할 수 있는 개체입니다.

구현

설명

내부 저장소를 공개적으로 사용할 수 없는 컬렉션의 경우 예상된 구현에서는 현재 인스턴스를 반환합니다. 현재 instance 대한 포인터는 다른 컬렉션을 래핑하는 컬렉션에 충분하지 않을 수 있습니다. 이러한 컬렉션은 기본 컬렉션의 SyncRoot 속성을 반환해야 합니다.

에 있는 대부분의 컬렉션 클래스는 System.Collections 네임 스페이스는 내부 컬렉션에 동기화 된 래퍼를 제공 하는 동기화 메서드를 구현 합니다. 그러나 파생 클래스는 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  

컬렉션을 열거 되지 본질적으로 스레드로부터 안전한 프로시저가 있습니다. 컬렉션이 동기화되어 있을 때 다른 스레드에서 해당 컬렉션을 수정할 수 있으므로 이렇게 되면 열거자에서 예외가 throw됩니다. 열거하는 동안 스레드로부터 안전을 보장하려면 전체 열거를 수행하는 동안 컬렉션을 잠그거나 다른 스레드에서 변경된 내용으로 인해 발생한 예외를 catch하면 됩니다.

다음 코드 예제에 사용 하 여 컬렉션을 잠그는 방법을 보여 줍니다는 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  

적용 대상

추가 정보