ICollection.SyncRoot 屬性

定義

取得可用以同步存取 ICollection 的物件。

C#
public object SyncRoot { get; }

屬性值

可用來同步存取 ICollection 的物件。

備註

對於那些無法公開使用基礎存放區的集合而言,所預期的實作會傳回目前的執行個體。 請注意,目前實例的指標可能不足以包裝其他集合的集合;這些應該會傳回基礎集合的 SyncRoot 屬性。

System.Collections 命名空間中大部分的集合類別也實作 Synchronized 方法,這會提供基礎集合周圍同步處理的包裝函式。 然而,衍生類別 (Derived Class) 可以使用 SyncRoot 屬性,提供它們自己集合的同步化版本。 必須在集合的 SyncRoot 屬性上執行同步處理程式碼的作業,而不是直接在集合上執行。 如此可確保衍生自其他物件的集合可以正常運作, 特別是可以與其他可能同時修改集合執行個體的執行緒,保持正常的同步處理。

在集合上沒有 Synchronized 方法時,預期的使用方式 SyncRoot 如下所示:

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

透過集合進行列舉在本質上並非安全執行緒程序。 即使集合經過同步化,其他的執行緒仍可修改該集合,使列舉值擲回例外狀況。 若要保證列舉過程的執行緒安全,您可以在整個列舉過程中鎖定集合,或攔截由其他執行緒的變更所造成的例外狀況。

下列程式代碼範例示範如何在整個列舉期間使用 SyncRoot 屬性鎖定集合。

C#
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

另請參閱