次の方法で共有


ReaderWriterLockSlim.EnterUpgradeableReadLock メソッド

定義

アップグレード可能モードでロックに入ることを試みます。

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 スレッドは、それらのスレッドがタイムアウトするか書き込みモードに入ってから終了するまでブロックします。

注意

ロックで再帰が許可されている場合、アップグレード可能モードでロックに入ったスレッドは、他のスレッドが書き込みモードに入るのを待機している場合でも、アップグレード可能モードに再帰的に入ることができます。

適用対象