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ığı kilidi herhangi bir modda zaten 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 numarası 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ılmış.
Ö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 olmak için 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şmezse, 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 rekürsiyona izin vermediğinde, programlamak daha basit ve daha az hataya açık 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öndürmeyebilir. 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ürebilirsiniz.
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üşürebilir veya yazma moduna yükseltebilir.
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öntemi çağıran EnterUpgradeableReadLock bir iş parçacığı, bu iş parçacıkları zaman aşımına uğradı veya yazma moduna girdikten sonra ondan çıkana kadar bloklar.
Note
Bir kilit özyinelemeye izin veriyorsa, kilidi yükseltilebilir modda giren bir iş parçacığı, diğer iş parçacıkları yazma moduna girmeyi bekliyor olsa bile yükseltilebilir moda yinelemeli olarak girebilir.