ReaderWriterLockSlim.EnterUpgradeableReadLock Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Kilidi yükseltilebilir modda girmeye çalışır.
public:
void EnterUpgradeableReadLock();
public void EnterUpgradeableReadLock ();
member this.EnterUpgradeableReadLock : unit -> unit
Public Sub EnterUpgradeableReadLock ()
Özel durumlar
RecursionPolicy özelliğidir NoRecursion ve geçerli iş parçacığı zaten herhangi bir modda kilidi girmiştir.
-veya-
Geçerli iş parçacığı okuma moduna girdi, bu nedenle yükseltilebilir moda girmeye çalışmak kilitlenme olasılığına neden olabilir.
-veya-
Özyineleme sayısı sayacın kapasitesini aşabilir. Sınır, uygulamaların hiçbir zaman karşılaşmaması için o kadar büyük ki.
ReaderWriterLockSlim Nesnesi atıldı.
Örnekler
Aşağıdaki örnekte, yükseltilebilir modda kilidi girmek için yönteminin nasıl kullanılacağı EnterUpgradeableReadLock gösterilmektedir.
finally
Çağıranın yükseltilebilir moddan ExitUpgradeableReadLock çıktığından emin olarak yöntemini yürütmek için bir blok kullanılır.
Örnekte gösterilen yöntem, bir anahtarla ilişkili değeri alır ve yeni bir değerle karşılaştırır. Değer değişmediyse, yöntem değişiklik olmadığını belirten bir durum döndürür. Anahtar için değer bulunamazsa anahtar/değer çifti eklenir. Değer değiştiyse güncelleştirilir. Yükseltilebilir mod, iş parçacığının kilitlenme riski olmadan okuma kilidini gerektiği gibi yükseltmesine olanak tanır.
Örnek, kilidi oluşturmak için parametresiz oluşturucuyu kullandığından özyineleme işlemine izin verilmez. ReaderWriterLockSlim Kilit özyinelemelere izin vermediğinde programlamak daha basittir ve hataya daha az eğilimli olur.
Bu kod, sınıfı için ReaderWriterLockSlim sağlanan daha büyük bir örneğin parçasıdır.
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
Açıklamalar
Bu yöntem çağıran iş parçacığı kilidi girene kadar engeller ve bu nedenle hiçbir zaman dönmeyebilir. TryEnterUpgradeableReadLock Belirtilen bir aralığı engellemek için yöntemini kullanın ve ardından çağıran iş parçacığı bu aralık boyunca yükseltilebilir moda girmediyse döndür.
Bir iş parçacığı genellikle okuma modunda korunan ReaderWriterLockSlim kaynağa eriştiğinde yükseltilebilir modu kullanın, ancak belirli koşullar karşılanırsa yazma moduna girmesi gerekebilir. Yükseltilebilir modda bir iş parçacığı okuma moduna düşürülebilir veya yazma moduna yükseltilebilir.
Herhangi bir anda yalnızca bir iş parçacığı yükseltilebilir moda girebilir. bir iş parçacığı yükseltilebilir moddaysa ve yazma moduna girmek için bekleyen iş parçacığı yoksa, yükseltilebilir moda girmeyi bekleyen iş parçacıkları olsa bile başka iş parçacıkları okuma moduna girebilir.
Bir veya daha fazla iş parçacığı yazma moduna girmeyi bekliyorsa, yöntem çağıran EnterUpgradeableReadLock bir iş parçacığı zaman aşımına uğradı veya yazma moduna girip ondan çıkana kadar engeller.
Not
Bir kilit özyinelemeye izin veriyorsa, kilidi yükseltilebilir modda giren bir iş parçacığı, diğer iş parçacıkları yazma moduna girmeyi beklese bile yükseltilebilir moda yinelemeli olarak girebilir.