LockRecursionException LockRecursionException LockRecursionException LockRecursionException Class

Определение

Исключение генерируется, когда рекурсивная запись блокировки не совпадает с рекурсивной политикой блокировки.The exception that is thrown when recursive entry into a lock is not compatible with the recursion policy for the lock.

public ref class LockRecursionException : Exception
[System.Serializable]
public class LockRecursionException : Exception
type LockRecursionException = class
    inherit Exception
Public Class LockRecursionException
Inherits Exception
Наследование
LockRecursionExceptionLockRecursionExceptionLockRecursionExceptionLockRecursionException
Атрибуты

Примеры

В следующем примере показаны две причины LockRecursionException ReaderWriterLockSlim использования класса.The following example shows two causes of LockRecursionException when using the ReaderWriterLockSlim class. Программа создает ReaderWriterLockSlim с помощью конструктора без параметров, который запрещает рекурсию.The program creates a ReaderWriterLockSlim by using the parameterless constructor, which disallows recursion. Затем программа запускает поток, который входит в блокировку в режиме чтения.The program then starts a thread that enters the lock in read mode. Поток пытается войти в блокировку рекурсивно в режиме чтения и перехватывает результирующее исключение.The thread tries to enter the lock recursively in read mode, and catches the resulting exception. Наконец, поток пытается войти в режим записи, что может привести к взаимоблокировкам.Finally, the thread tries to enter write mode, which would create a potential for deadlocks. Поток перехватывает результирующее исключение.The thread catches the resulting exception.

using System;
using System.Threading;

class Example
{
    // By default, the lock recursion policy for a new 
    // ReaderWriterLockSlim does not allow recursion.
    static ReaderWriterLockSlim rwls = new ReaderWriterLockSlim();

    static void ThreadProc()
    {
        Console.WriteLine("Acquire the reader lock.");
        rwls.EnterReadLock();

        try
        {
            Console.WriteLine("\nAttempt to acquire the reader lock recursively:");
            rwls.EnterReadLock();
        }
        catch (LockRecursionException lre)
        {
            Console.WriteLine("{0}: {1}", 
                lre.GetType().Name, lre.Message);
        }

        try
        {
            Console.WriteLine("\nAttempt to acquire the writer lock recursively:");
            rwls.EnterWriteLock();
        }
        catch (LockRecursionException lre)
        {
            Console.WriteLine("{0}: {1}", 
                lre.GetType().Name, lre.Message);
        }
    }

    static void Main()
    {
        Thread t = new Thread(ThreadProc);
        t.Start();
        t.Join();
    }
}

/* This code example produces output similar to the following:

Acquire the reader lock.

Attempt to acquire the reader lock recursively:
LockRecursionException: Recursive read lock acquisitions not allowed in this mode.

Attempt to acquire the writer lock recursively:
LockRecursionException: Write lock may not be acquired with read lock held. This pattern is prone to deadlocks. Consider using the upgrade lock.
 */
Imports System.Threading

Class Example
    ' By default, the lock recursion policy for a new 
    ' ReaderWriterLockSlim does not allow recursion.
    Private Shared rwls As New ReaderWriterLockSlim()
    
    Shared Sub ThreadProc() 
        Console.WriteLine("Acquire the reader lock.")
        rwls.EnterReadLock()
        
        Try
            Console.WriteLine(vbCrLf & _
                "Attempt to acquire the reader lock recursively:")
            rwls.EnterReadLock()
        Catch lre As LockRecursionException
            Console.WriteLine("{0}: {1}", _
                lre.GetType().Name, lre.Message)
        End Try
        
        Try
            Console.WriteLine(vbCrLf & _
                "Attempt to acquire the writer lock recursively:")
            rwls.EnterWriteLock()
        Catch lre As LockRecursionException
            Console.WriteLine("{0}: {1}", _
                lre.GetType().Name, lre.Message)
        End Try
    
    End Sub 
    
    Shared Sub Main() 

        Dim t As New Thread(AddressOf ThreadProc)
        t.Start()
        t.Join()
    
    End Sub 
End Class 

' This code example produces output similar to the following:
'
'Acquire the reader lock.
'
'Attempt to acquire the reader lock recursively:
'LockRecursionException: Recursive read lock acquisitions not allowed in this mode.
'
'Attempt to acquire the writer lock recursively:
'LockRecursionException: Write lock may not be acquired with read lock held. This pattern is prone to deadlocks. Consider using the upgrade lock.
' 

Комментарии

LockRecursionExceptionвызывается по нескольким причинам, включая следующие:LockRecursionException is thrown for several reasons, including the following:

  • Значение, если поток пытается войти в экземпляр ReaderWriterLockSlim рекурсивно, но экземпляр не поддерживает рекурсию.If a thread tries to enter an instance of ReaderWriterLockSlim recursively, but the instance does not support recursion.

  • Значение, если поток пытается войти ReaderWriterLockSlim в экземпляр в режиме записи или обновляемом режиме, когда поток первоначально вошел в блокировку в режиме чтения.If a thread tries to enter a ReaderWriterLockSlim instance in write mode or upgradeable mode when the thread initially entered the lock in read mode. Это представляет потенциальную взаимоблокировку и поэтому не допускается.This represents a potential deadlock and therefore is not allowed.

  • Если разрешение на один дополнительный уровень рекурсии превысит максимальное значение для счетчика внутреннего хранилища, используемого для трассировки рекурсии.If allowing one more level of recursion would exceed the maximum value for the internal storage counter used to track recursions. Это ограничение настолько велико, что оно не должно достигаться приложениями на практике.This limit is so large that applications should never encounter it.

Конструкторы

LockRecursionException() LockRecursionException() LockRecursionException() LockRecursionException()

Инициализирует новый экземпляр класса LockRecursionException с системным сообщением, содержащим описание ошибки.Initializes a new instance of the LockRecursionException class with a system-supplied message that describes the error.

LockRecursionException(SerializationInfo, StreamingContext) LockRecursionException(SerializationInfo, StreamingContext) LockRecursionException(SerializationInfo, StreamingContext) LockRecursionException(SerializationInfo, StreamingContext)

Инициализирует новый экземпляр класса LockRecursionException с сериализованными данными.Initializes a new instance of the LockRecursionException class with serialized data.

LockRecursionException(String) LockRecursionException(String) LockRecursionException(String) LockRecursionException(String)

Инициализирует новый экземпляр класса LockRecursionException с использованием заданного сообщения, содержащего описание ошибки.Initializes a new instance of the LockRecursionException class with a specified message that describes the error.

LockRecursionException(String, Exception) LockRecursionException(String, Exception) LockRecursionException(String, Exception) LockRecursionException(String, Exception)

Инициализирует новый экземпляр класса LockRecursionException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение.Initializes a new instance of the LockRecursionException class with a specified error message and a reference to the inner exception that is the cause of this exception.

Свойства

Data Data Data Data

Возвращает коллекцию пар ключ/значение, предоставляющие дополнительные сведения об исключении, определяемые пользователем.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink HelpLink HelpLink HelpLink

Получает или задает ссылку на файл справки, связанный с этим исключением.Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult HResult HResult HResult

Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException InnerException InnerException InnerException

Возвращает экземпляр класса Exception, который вызвал текущее исключение.Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message Message Message Message

Возвращает сообщение, описывающее текущее исключение.Gets a message that describes the current exception.

(Inherited from Exception)
Source Source Source Source

Возвращает или задает имя приложения или объекта, вызывавшего ошибку.Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace StackTrace StackTrace StackTrace

Получает строковое представление непосредственных кадров в стеке вызова.Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite TargetSite TargetSite TargetSite

Возвращает метод, создавший текущее исключение.Gets the method that throws the current exception.

(Inherited from Exception)

Методы

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException() GetBaseException() GetBaseException() GetBaseException()

При переопределении в производном классе возвращает исключение Exception, которое является корневой причиной одного или нескольких последующих исключений.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Inherited from Exception)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

При переопределении в производном классе задает сведения об исключении для SerializationInfo.When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Inherited from Exception)
GetType() GetType() GetType() GetType()

Возвращает тип среды выполнения текущего экземпляра.Gets the runtime type of the current instance.

(Inherited from Exception)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Создает и возвращает строковое представление текущего исключения.Creates and returns a string representation of the current exception.

(Inherited from Exception)

События

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

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

Дополнительно