ReaderWriterLockSlim.EnterUpgradeableReadLock Yöntem

Tanım

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.

Ö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.

Şunlara uygulanır