Bagikan melalui


ICollection.SyncRoot Properti

Definisi

Mendapatkan objek yang dapat digunakan untuk menyinkronkan akses ke ICollection.

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

Nilai Properti

Objek yang dapat digunakan untuk menyinkronkan akses ke ICollection.

Keterangan

Untuk koleksi yang penyimpanan yang mendasarnya tidak tersedia untuk umum, implementasi yang diharapkan adalah mengembalikan instans saat ini. Perhatikan bahwa penunjuk ke instans saat ini mungkin tidak cukup untuk koleksi yang membungkus koleksi lain; mereka harus mengembalikan properti koleksi yang mendasar SyncRoot .

Sebagian besar kelas koleksi di System.Collections namespace layanan juga menerapkan Synchronized metode , yang menyediakan pembungkus yang disinkronkan di sekitar koleksi yang mendasar. Namun, kelas turunan dapat menyediakan versi koleksi yang disinkronkan sendiri menggunakan SyncRoot properti . Kode sinkronisasi harus melakukan operasi pada SyncRoot properti koleksi, bukan langsung pada koleksi. Ini memastikan pengoperasian koleksi yang tepat yang berasal dari objek lain. Secara khusus, ini mempertahankan sinkronisasi yang tepat dengan utas lain yang mungkin secara bersamaan memodifikasi instans koleksi.

Dengan tidak adanya Synchronized metode pada koleksi, penggunaan yang diharapkan untuk SyncRoot terlihat sebagai berikut:

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

Menghitung melalui koleksi secara intrinsik bukan prosedur aman utas. Bahkan ketika koleksi disinkronkan, utas lain masih dapat memodifikasi koleksi, yang menyebabkan enumerator melemparkan pengecualian. Untuk menjamin keamanan utas selama enumerasi, Anda dapat mengunci koleksi selama seluruh enumerasi atau menangkap pengecualian yang dihasilkan dari perubahan yang dibuat oleh utas lain.

Contoh kode berikut menunjukkan cara mengunci koleksi menggunakan SyncRoot properti selama seluruh enumerasi.

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

Berlaku untuk

Lihat juga