使用英语阅读

通过


ICollection.SyncRoot 属性

定义

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

public object SyncRoot { get; }

属性值

用于同步对 ICollection 的访问的对象。

注解

对于其基础存储区不公用的集合,预期的实现是返回当前实例。 请注意,指向当前实例的指针对于包装其他集合的集合可能不够;应返回基础集合的 SyncRoot 属性。

System.Collections 命名空间中的大多数集合类也实现 Synchronized 方法,该方法对基础集合提供同步的包装。 不过,派生类可使用 SyncRoot 属性来提供各自的同步版本的集合。 同步代码必须对集合的 SyncRoot 属性执行操作,而不是直接对集合执行操作。 这样可确保对从其他对象派生的集合正确地执行操作。 具体地说,这样可与可能同时对集合实例进行修改的其他线程保持正确的同步。

在集合上没有 Synchronized 方法时,的预期用法 SyncRoot 如下所示:

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    // Some operation on the collection, which is now thread safe.
}

枚举整个集合本质上不是一个线程安全的过程。 即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。 若要确保枚举过程中的线程安全性,可以在整个枚举期间锁定集合,或者捕获由其他线程进行的更改所导致的异常。

下面的代码示例演示如何在整个枚举期间使用 SyncRoot 属性锁定集合。

ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另请参阅