Bagikan melalui


ReaderWriterLockSlim.ExitUpgradeableReadLock Metode

Definisi

Mengurangi jumlah rekursi untuk mode yang dapat ditingkatkan, dan keluar dari mode yang dapat ditingkatkan jika jumlah yang dihasilkan adalah 0 (nol).

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

Pengecualian

Utas saat ini belum memasukkan kunci dalam mode yang dapat ditingkatkan.

Contoh

Contoh berikut menunjukkan cara menggunakan finally blok untuk menjalankan ExitUpgradeableReadLock metode , memastikan bahwa pemanggil 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 tidak sensitif terhadap urutan rekursi. Misalnya, jika utas memasuki kunci dalam mode yang dapat ditingkatkan dan kemudian memasuki kunci dalam mode tulis, urutan di mana utas keluar dari dua mode tidak masalah. Jika kunci memungkinkan rekursi, utas dapat memasuki kunci dalam mode tulis lalu memasukkannya secara rekursif dalam mode yang dapat ditingkatkan; urutan di mana utas keluar dari mode yang dapat ditingkatkan dan mode tulis tidak masalah.

Keluar dari kunci mungkin memberi sinyal utas tunggu lainnya.

Berlaku untuk