ReaderWriterLockSlim.EnterUpgradeableReadLock 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
尝试以可升级模式进入锁。
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 该方法的线程将阻止,直到这些线程超时或进入写入模式,然后退出它。
注释
如果锁允许递归,则以可升级模式进入锁的线程可以递归进入可升级模式,即使其他线程正在等待进入写入模式。