ICollection.SyncRoot Özellik

Tanım

Erişimini eşitlemede kullanılabilecek bir nesne alır ICollection .Gets an object that can be used to synchronize access to the ICollection.

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

Object

Erişimini eşitlemede kullanılabilecek bir nesne ICollection .An object that can be used to synchronize access to the ICollection.

Açıklamalar

Temel alınan depo genel kullanıma açık olmayan koleksiyonlar için, beklenen uygulama geçerli örneği döndürmesidir.For collections whose underlying store is not publicly available, the expected implementation is to return the current instance. Geçerli örneğe yönelik işaretçinin diğer koleksiyonları saran koleksiyonlar için yeterli olamayacağını unutmayın; Bunlar, temel alınan koleksiyonun özelliğini döndürmelidir SyncRoot .Note that the pointer to the current instance might not be sufficient for collections that wrap other collections; those should return the underlying collection's SyncRoot property.

Ad alanındaki çoğu koleksiyon sınıfı System.Collections Synchronized , temel alınan koleksiyonun etrafında eşitlenmiş bir sarmalayıcı sağlayan bir yöntemi de uygular.Most collection classes in the System.Collections namespace also implement a Synchronized method, which provides a synchronized wrapper around the underlying collection. Ancak türetilmiş sınıflar, özelliğini kullanarak koleksiyonun kendilerine ait eşitlenmiş sürümlerini sağlayabilir SyncRoot .However, derived classes can provide their own synchronized version of the collection using the SyncRoot property. Eşitleme kodu, SyncRoot doğrudan koleksiyonda değil, koleksiyonun özelliği üzerinde işlem gerçekleştirmelidir.The synchronizing code must perform operations on the SyncRoot property of the collection, not directly on the collection. Bu, diğer nesnelerden türetilen toplulukların düzgün çalışmasını sağlar.This ensures proper operation of collections that are derived from other objects. Özellikle, koleksiyon örneğinde eşzamanlı olarak değişiklik gerektirebilecek diğer iş parçacıklarıyla doğru eşitleme sağlar.Specifically, it maintains proper synchronization with other threads that might be simultaneously modifying the collection instance.

Bir koleksiyondaki Yöntem yokluğunda Synchronized , için beklenen kullanım şöyle SyncRoot görünür:In the absence of a Synchronized method on a collection, the expected usage for SyncRoot looks as follows:

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.Enumerating through a collection is intrinsically not a thread-safe procedure. 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.Even when a collection is synchronized, other threads can still modify the collection, which causes the enumerator to throw an exception. 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.To guarantee thread safety during enumeration, you can either lock the collection during the entire enumeration or catch the exceptions resulting from changes made by other threads.

Aşağıdaki kod örneği, SyncRoot tüm numaralandırma sırasında özelliğini kullanarak koleksiyonun nasıl kilitleneceği gösterilmektedir.The following code example shows how to lock the collection using the SyncRoot property during the entire enumeration.

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.