Share via


ReaderWriterLockSlim.EnterUpgradeableReadLock Metode

Definisi

Mencoba memasukkan kunci dalam mode yang dapat ditingkatkan.

public:
 void EnterUpgradeableReadLock();
public void EnterUpgradeableReadLock ();
member this.EnterUpgradeableReadLock : unit -> unit
Public Sub EnterUpgradeableReadLock ()

Pengecualian

Properti RecursionPolicy adalah NoRecursion dan utas saat ini telah memasuki kunci dalam mode apa pun.

-atau-

Utas saat ini telah memasuki mode baca, jadi mencoba memasuki mode yang dapat ditingkatkan akan menciptakan kemungkinan kebuntuan.

-atau-

Jumlah rekursi akan melebihi kapasitas penghitung. Batasnya sangat besar sehingga aplikasi tidak boleh menemukannya.

Contoh

Contoh berikut menunjukkan cara menggunakan EnterUpgradeableReadLock metode untuk memasukkan kunci dalam mode yang dapat ditingkatkan. finally Blok digunakan untuk menjalankan ExitUpgradeableReadLock metode , memastikan bahwa penelepon keluar dari mode yang dapat ditingkatkan.

Metode yang ditunjukkan dalam contoh mengambil nilai yang terkait dengan kunci dan membandingkannya dengan nilai baru. Jika nilai tidak berubah, metode mengembalikan status yang menunjukkan tidak ada perubahan. Jika tidak ada nilai yang ditemukan untuk kunci, pasangan kunci/nilai akan disisipkan. Jika nilai telah berubah, nilai akan diperbarui. Mode yang dapat ditingkatkan memungkinkan utas untuk meningkatkan kunci baca sesuai kebutuhan, tanpa risiko kebuntuan.

Contoh menggunakan konstruktor tanpa parameter untuk membuat kunci, sehingga rekursi tidak diizinkan. Pemrograman ReaderWriterLockSlim lebih sederhana dan kurang rentan terhadap kesalahan ketika kunci tidak memungkinkan pengulangan.

Kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk ReaderWriterLockSlim kelas .

private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private Dictionary<int, string> innerCache = new Dictionary<int, string>();
Private cacheLock As New ReaderWriterLockSlim()
Private innerCache As New Dictionary(Of Integer, String)
public AddOrUpdateStatus AddOrUpdate(int key, string value)
{
    cacheLock.EnterUpgradeableReadLock();
    try
    {
        string result = null;
        if (innerCache.TryGetValue(key, out result))
        {
            if (result == value)
            {
                return AddOrUpdateStatus.Unchanged;
            }
            else
            {
                cacheLock.EnterWriteLock();
                try
                {
                    innerCache[key] = value;
                }
                finally
                {
                    cacheLock.ExitWriteLock();
                }
                return AddOrUpdateStatus.Updated;
            }
        }
        else
        {
            cacheLock.EnterWriteLock();
            try
            {
                innerCache.Add(key, value);
            }
            finally
            {
                cacheLock.ExitWriteLock();
            }
            return AddOrUpdateStatus.Added;
        }
    }
    finally
    {
        cacheLock.ExitUpgradeableReadLock();
    }
}
Public Function AddOrUpdate(ByVal key As Integer, _
                            ByVal value As String) As AddOrUpdateStatus
    cacheLock.EnterUpgradeableReadLock()
    Try
        Dim result As String = Nothing
        If innerCache.TryGetValue(key, result) Then
            If result = value Then
                Return AddOrUpdateStatus.Unchanged
            Else
                cacheLock.EnterWriteLock()
                Try
                    innerCache.Item(key) = value
                Finally
                    cacheLock.ExitWriteLock()
                End Try
                Return AddOrUpdateStatus.Updated
            End If
        Else
            cacheLock.EnterWriteLock()
            Try
                innerCache.Add(key, value)
            Finally
                cacheLock.ExitWriteLock()
            End Try
            Return AddOrUpdateStatus.Added
        End If
    Finally
        cacheLock.ExitUpgradeableReadLock()
    End Try
End Function
public enum AddOrUpdateStatus
{
    Added,
    Updated,
    Unchanged
};
Public Enum AddOrUpdateStatus
    Added
    Updated
    Unchanged
End Enum

Keterangan

Metode ini memblokir sampai utas panggilan memasuki kunci, dan oleh karena itu mungkin tidak pernah kembali. TryEnterUpgradeableReadLock Gunakan metode untuk memblokir interval tertentu, lalu kembalikan jika utas panggilan belum memasuki mode yang dapat ditingkatkan selama interval tersebut.

Gunakan mode yang dapat ditingkatkan ketika utas biasanya mengakses sumber daya yang dilindungi oleh ReaderWriterLockSlim dalam mode baca, tetapi mungkin perlu memasuki mode tulis jika kondisi tertentu terpenuhi. Utas dalam mode yang dapat ditingkatkan dapat menurunkan tingkat ke mode baca atau meningkatkan ke mode tulis.

Hanya satu utas yang dapat memasuki mode yang dapat ditingkatkan pada waktu tertentu. Jika utas dalam mode yang dapat ditingkatkan, dan tidak ada utas yang menunggu untuk memasuki mode tulis, sejumlah utas lain dapat memasuki mode baca, bahkan jika ada utas yang menunggu untuk memasuki mode yang dapat ditingkatkan.

Jika satu atau beberapa utas menunggu untuk memasuki mode tulis, utas yang memanggil blok metode sampai utas tersebut EnterUpgradeableReadLock telah kehabisan waktu atau memasuki mode tulis lalu keluar darinya.

Catatan

Jika kunci memungkinkan rekursi, utas yang telah memasuki kunci dalam mode yang dapat ditingkatkan dapat memasuki mode yang dapat ditingkatkan secara rekursif, bahkan jika utas lain menunggu untuk memasuki mode tulis.

Berlaku untuk