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 つのモードを終了する順序は関係ありません。 ロックで再帰が許可されている場合、スレッドは書き込みモードでロックに入り、アップグレード可能モードで再帰的に入力できます。スレッドがアップグレード可能モードと書き込みモードを終了する順序は関係ありません。
ロックを終了すると、他の待機スレッドに通知されることがあります。
適用対象
.NET