ReaderWriterLockSlim.EnterUpgradeableReadLock Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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.
Objek ReaderWriterLockSlim telah dibuang.
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.