ReaderWriterLockSlim.EnterUpgradeableReadLock メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
アップグレード可能モードでロックに入ることを試みます。
public:
void EnterUpgradeableReadLock();
public void EnterUpgradeableReadLock ();
member this.EnterUpgradeableReadLock : unit -> unit
Public Sub EnterUpgradeableReadLock ()
例外
RecursionPolicy プロパティが NoRecursion で、現在のスレッドは既にいずれかのモードでロックに入っています。
- または -
現在のスレッドは既に読み取りモードに入っているため、アップグレード可能モードに入ろうとするとデッドロックの可能性が生じます。
- または -
再帰の回数は、カウンターの容量を超える可能性があります。 この容量は非常に大きいので、アプリケーションでこの状況が発生することは通常はありません。
ReaderWriterLockSlim オブジェクトは破棄されました。
例
次の例は、 メソッドを使用 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 保護されているリソースにアクセスするが、特定の条件が満たされた場合に書き込みモードに入る必要がある場合は、アップグレード可能モードを使用します。 アップグレード可能モードのスレッドは、読み取りモードにダウングレードすることも、書き込みモードにアップグレードすることもできます。
特定の時点でアップグレード可能モードに入ることができるスレッドは 1 つだけです。 スレッドがアップグレード可能モードで、書き込みモードに入るのを待機しているスレッドがない場合は、アップグレード可能モードに入るのを待機しているスレッドが存在する場合でも、他の任意の数のスレッドが読み取りモードに入ることができます。
1 つ以上のスレッドが書き込みモードに入るのを待機している場合、メソッドを呼び出す EnterUpgradeableReadLock スレッドは、それらのスレッドがタイムアウトするか書き込みモードに入ってから終了するまでブロックします。
注意
ロックで再帰が許可されている場合、アップグレード可能モードでロックに入ったスレッドは、他のスレッドが書き込みモードに入るのを待機している場合でも、アップグレード可能モードに再帰的に入ることができます。
適用対象
.NET