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
注釈
このメソッドは再帰の順序に依存しません。 たとえば、スレッドがアップグレード可能モードでロックに入り、書き込みモードでロックに入った場合、スレッドが 2 つのモードを終了する順序は関係ありません。 ロックで再帰が許可されている場合、スレッドは書き込みモードでロックに入り、アップグレード可能モードで再帰的にロックに入ることができます。スレッドがアップグレード可能モードと書き込みモードを終了する順序は関係ありません。
ロックを終了すると、他の待機中のスレッドに通知される場合があります。