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

Note

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

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

適用対象