ICollection.SyncRoot Özellik

Tanım

erişimi ICollectioneşitlemek için kullanılabilecek bir nesnesi alır.

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

Özellik Değeri

erişimi ICollectioneşitlemek için kullanılabilecek bir nesne.

Açıklamalar

Temel alınan deposu genel kullanıma açık olmayan koleksiyonlar için beklenen uygulama geçerli örneği döndürmektir. Geçerli örneğin işaretçisinin diğer koleksiyonları sarmalayan koleksiyonlar için yeterli olmayabileceğini unutmayın; bunlar temel koleksiyonun SyncRoot özelliğini döndürmelidir.

Ad alanında çoğu koleksiyon sınıfı, temel koleksiyonun System.Collections çevresinde eşitlenmiş bir sarmalayıcı sağlayan bir yöntem de uygular Synchronized . Ancak türetilmiş sınıflar, özelliğini kullanarak SyncRoot koleksiyonun kendi eşitlenmiş sürümlerini sağlayabilir. Eşitleme kodu, doğrudan koleksiyon üzerinde SyncRoot değil, koleksiyonun özelliğinde işlemler gerçekleştirmelidir. Bu, diğer nesnelerden türetilen toplulukların düzgün çalışmasını sağlar. Özellikle, koleksiyon örneğini aynı anda değiştirebilecek diğer iş parçacıklarıyla düzgün eşitlemeyi sürdürür.

Bir koleksiyonda bir yöntemin Synchronized olmaması halinde için SyncRoot beklenen kullanım aşağıdaki gibi görünür:

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

Bir koleksiyon ile numaralandırma, aslında iş parçacığı açısından güvenli yordam değildir. Bir koleksiyon eşitlendiği zaman bile, diğer iş parçacıkları numaralandırıcının özel durum oluşturmasına neden olan koleksiyonu değiştirebilir. Numaralandırma sırasında iş parçacığı güvenliği sağlamak için tüm numaralandırma sırasında koleksiyonu kilitleyebilir veya diğer iş parçacıkları tarafından yapılan değişikliklerden kaynaklanan özel durumları yakalayabilirsiniz.

Aşağıdaki kod örneği, tüm numaralandırma sırasında özelliğini kullanarak SyncRoot koleksiyonun nasıl kilitlenmesini gösterir.

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

Şunlara uygulanır

Ayrıca bkz.