NameObjectCollectionBase.ICollection.SyncRoot 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取一个对象,该对象可用于同步对 NameObjectCollectionBase 对象的访问。
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
属性值
一个对象,该对象可用于同步对 NameObjectCollectionBase 对象的访问。
实现
注解
派生类可以使用 属性提供其自己的类的同步版本NameObjectCollectionBaseSyncRoot。 同步代码必须对 SyncRoot 对象的 属性 NameObjectCollectionBase 执行操作,而不是直接对 NameObjectCollectionBase 对象执行操作。 这样可确保对从其他对象派生的集合正确地执行操作。 具体而言,它与可能同时修改 NameObjectCollectionBase 对象的其他线程保持正确的同步。
枚举整个集合本质上不是一个线程安全的过程。 即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。 若要确保枚举过程中的线程安全性,可以在整个枚举期间锁定集合,或者捕获由其他线程进行的更改所导致的异常。
下面的代码示例演示如何在整个枚举期间使用 SyncRoot 锁定集合。
// Create a collection derived from NameObjectCollectionBase
ICollection^ myCollection = gcnew DerivedCollection();
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);
}
}
// Create a collection derived from NameObjectCollectionBase
ICollection myCollection = new DerivedCollection();
lock(myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}
' Create a collection derived from NameObjectCollectionBase
Dim myCollection As ICollection = New DerivedCollection()
SyncLock myCollection.SyncRoot
For Each item As Object In myCollection
' Insert your code here.
Next item
End SyncLock
检索此属性的值的运算复杂度为 O(1)。