Поделиться через


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 Используйте метод , чтобы заблокировать для указанного интервала, а затем возвращайте, если вызывающий поток не вошел в режим чтения в течение этого интервала.

Несколько потоков могут одновременно переходить в режим чтения.

Если один или несколько потоков ожидают выхода в режим записи, поток, вызывающий EnterReadLock метод, блокирует время ожидания этих потоков или не перейдет в режим записи, а затем не выйдет из него.

Примечание

Если блокировка допускает рекурсию, поток, который вступил в блокировку в режиме чтения, может перейти в режим чтения рекурсивно, даже если другие потоки ожидают выхода в режим записи.

Не более одного потока может находиться в обновляемом режиме, а другие — в режиме чтения. Если дополнительные потоки ожидают перехода в обновляемый режим и нет потоков, ожидающих перехода в режим записи, потоки, вызывающие EnterReadLock метод, немедленно переходят в режим чтения и не блокируются.

Применяется к