閱讀英文

共用方式為


ICollection.SyncRoot 屬性

定義

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

public:
 property System::Object ^ SyncRoot { System::Object ^ get(); };
public object SyncRoot { get; }
member this.SyncRoot : obj
Public ReadOnly Property SyncRoot As Object

屬性值

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

備註

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

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

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

ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
    Monitor::Enter(myCollection->SyncRoot, lockTaken);
    // Some operation on the collection, which is now thread safe.
}
finally
{
    if (lockTaken)
    {
        Monitor::Exit(myCollection->SyncRoot);
    }
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    // Some operation on the collection, which is now thread safe.
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    ' Some operation on the collection, which is now thread safe.
End SyncLock

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

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

ICollection^ myCollection = someCollection;
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);
    }
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
    For Each item In myCollection
        ' Insert your code here.
    Next item
End SyncLock

適用於

產品 版本
.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

另請參閱