ReaderWriterLockSlim.EnterUpgradeableReadLock 方法

定义

尝试进入可升级模式锁定状态。

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

例外

RecursionPolicy 属性为 NoRecursion,而且当前线程已进入任意模式的锁定状态。

- 或 -

当前线程已进入读取模式,因此尝试进入可升级模式将有可能导致死锁。

- 或 -

递归数将超出该计数器的容量。 此限制数值很大,因此任何情况下应用程序都不应遇到此情况。

示例

以下示例演示如何使用 EnterUpgradeableReadLock 方法在可升级模式下进入锁。 块 finally 用于执行 ExitUpgradeableReadLock 方法,确保调用方退出可升级模式。

示例中所示的 方法检索与键关联的值,并将其与新值进行比较。 如果值未更改,该方法将返回一个状态,指示没有更改。 如果未找到键的值,则插入键/值对。 如果值已更改,则更新该值。 可升级模式允许线程根据需要升级读取锁,而不会有死锁的风险。

该示例使用无参数构造函数创建锁,因此不允许递归。 当锁不允许递归时, ReaderWriterLockSlim 编程更简单,并且不容易出错。

此代码是为 类提供的更大示例的 ReaderWriterLockSlim 一部分。

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

注解

此方法将阻止,直到调用线程进入锁,因此可能永远不会返回。 TryEnterUpgradeableReadLock使用 方法阻止指定间隔,如果调用线程在该时间间隔内未进入可升级模式,则返回 。

当线程通常在读取模式下访问受 ReaderWriterLockSlim 保护的资源时,请使用可升级模式,但如果满足某些条件,则可能需要进入写入模式。 处于可升级模式的线程可以降级到读取模式或升级到写入模式。

在任何给定时间,只有一个线程可以进入可升级模式。 如果线程处于可升级模式,并且没有线程等待进入写入模式,则任何其他线程都可以进入读取模式,即使有线程正在等待进入可升级模式。

如果一个或多个线程正在等待进入写入模式,则调用 方法的 EnterUpgradeableReadLock 线程会阻塞,直到这些线程超时或进入写入模式,然后退出该模式。

注意

如果锁允许递归,则已进入可升级模式锁定的线程可以递归方式进入可升级模式,即使其他线程正在等待进入写入模式。

适用于