Share via


ICollection.SyncRoot 属性

获取可用于同步 ICollection 访问的对象。

**命名空间:**System.Collections
**程序集:**mscorlib(在 mscorlib.dll 中)

语法

声明
ReadOnly Property SyncRoot As Object
用法
Dim instance As ICollection
Dim value As Object

value = instance.SyncRoot
Object SyncRoot { get; }
property Object^ SyncRoot {
    Object^ get ();
}
/** @property */
Object get_SyncRoot ()
function get 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

平台

Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

.NET Compact Framework

受以下版本支持:2.0、1.0

请参见

参考

ICollection 接口
ICollection 成员
System.Collections 命名空间
ICollection.IsSynchronized 属性