ReaderWriterLockSlim.ExitUpgradeableReadLock 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
减少可升级模式的递归计数,并在生成的计数为 0(零)时退出可升级模式。
public:
void ExitUpgradeableReadLock();
public void ExitUpgradeableReadLock ();
member this.ExitUpgradeableReadLock : unit -> unit
Public Sub ExitUpgradeableReadLock ()
例外
当前线程未进入可升级模式锁定状态。
示例
以下示例演示如何使用 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
注解
此方法对递归顺序不敏感。 例如,如果线程在可升级模式下进入锁,然后在写入模式下进入锁,则线程退出这两种模式的顺序并不重要。 如果锁允许递归,线程可以在写入模式下进入锁,然后在可升级模式下以递归方式输入它:线程退出可升级模式和写入模式的顺序并不重要。
退出锁可能表示其他正在等待的线程。