ReaderWriterLockSlim.EnterReadLock メソッド

定義

読み取りモードでロックに入ることを試みます。

public:
 void EnterReadLock();
public void EnterReadLock ();
member this.EnterReadLock : unit -> unit
Public Sub EnterReadLock ()

例外

RecursionPolicy プロパティは NoRecursion です。現在のスレッドは、読み取りロックを保持しながら読み取りロックを取得しようとしました。

- または -

RecursionPolicy プロパティは NoRecursion です。現在のスレッドは、書き込みロックを保持しながら読み取りロックを取得しようとしました。

- または -

再帰の回数は、カウンターの容量を超える可能性があります。 この制限は非常に大きいため、アプリケーションで、この例外が発生することはないはずです。

ReaderWriterLockSlim オブジェクトは破棄されました。

次の例は、 メソッドを使用して読み取り EnterReadLock モードでロックを入力する方法を示しています。 この例に示す メソッドは、キーに関連付けられている値を取得します。 キーが見つからない場合、内部 Dictionary<TKey,TValue> によってスローされた例外はメソッドを終了できます。 finallyブロックを使用してメソッドをExitReadLock実行し、呼び出し元が読み取りモードを終了することを確認します。

このコードは、 クラスに対して提供されるより大きな例の 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 string Read(int key)
{
    cacheLock.EnterReadLock();
    try
    {
        return innerCache[key];
    }
    finally
    {
        cacheLock.ExitReadLock();
    }
}
Public Function Read(ByVal key As Integer) As String
    cacheLock.EnterReadLock()
    Try
        Return innerCache(key)
    Finally
        cacheLock.ExitReadLock()
    End Try
End Function

注釈

このメソッドは、呼び出し元のスレッドがロックに入るまでブロックするため、返されない可能性があります。 メソッドを TryEnterReadLock 使用して、指定した間隔でブロックし、呼び出し元スレッドがその間隔で読み取りモードに入っていない場合は を返します。

複数のスレッドが同時に読み取りモードに入ることができます。

1 つ以上のスレッドが書き込みモードに入るのを待機している場合、メソッドを呼び出す EnterReadLock スレッドは、それらのスレッドがタイムアウトするか書き込みモードに入ってから終了するまでブロックします。

注意

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

最大 1 つのスレッドはアップグレード可能モードで、他のスレッドは読み取りモードです。 追加のスレッドがアップグレード可能モードに入るのを待機していて、書き込みモードを待機しているスレッドがない場合、メソッドを呼び出 EnterReadLock すスレッドは直ちに読み取りモードに入り、ブロックしません。

適用対象