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

適用於

另請參閱