LockRecursionException Classe

Definição

A exceção que é lançada quando a entrada recursiva num bloqueio não é compatível com a política de recursão para o bloqueio.

public ref class LockRecursionException : Exception
public class LockRecursionException : Exception
[System.Serializable]
public class LockRecursionException : Exception
type LockRecursionException = class
    inherit Exception
[<System.Serializable>]
type LockRecursionException = class
    inherit Exception
Public Class LockRecursionException
Inherits Exception
Herança
LockRecursionException
Atributos

Exemplos

O exemplo seguinte mostra duas causas de LockRecursionException quando se utiliza a ReaderWriterLockSlim classe. O programa cria um ReaderWriterLockSlim usando o construtor sem parâmetros, que não permite recursão. O programa inicia então um thread que entra no bloqueio em modo de leitura. A thread tenta entrar no bloqueio recursivamente em modo de leitura e apanha a exceção resultante. Finalmente, o thread tenta entrar em modo de escrita, o que criaria um potencial para deadlocks. A thread apanha a exceção resultante.

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.
'

Observações

LockRecursionException é lançado por várias razões, incluindo as seguintes:

  • Se um thread tentar entrar numa instância de ReaderWriterLockSlim recursivamente, mas a instância não suporta recursão.

  • Se uma thread tentar entrar numa ReaderWriterLockSlim instância em modo de escrita ou modo atualizável quando a thread entrou inicialmente no bloqueio em modo de leitura. Isto representa um possível impasse e, por isso, não é permitido.

  • Se permitir mais um nível de recursão excederia o valor máximo do contador de armazenamento interno usado para rastrear recursões. Este limite é tão grande que as aplicações nunca o deverão encontrar.

Construtores

Name Description
LockRecursionException()

Inicializa uma nova instância da LockRecursionException classe com uma mensagem fornecida pelo sistema que descreve o erro.

LockRecursionException(SerializationInfo, StreamingContext)

Inicializa uma nova instância da LockRecursionException classe com dados serializados.

LockRecursionException(String, Exception)

Inicializa uma nova instância da LockRecursionException classe com uma mensagem de erro especificada e uma referência à exceção interna que é a causa dessa exceção.

LockRecursionException(String)

Inicializa uma nova instância da LockRecursionException classe com uma mensagem especificada que descreve o erro.

Propriedades

Name Description
Data

Obtém uma coleção de pares chave/valor que fornecem informação adicional definida pelo utilizador sobre a exceção.

(Herdado de Exception)
HelpLink

Obtém ou define um link para o ficheiro de ajuda associado a esta exceção.

(Herdado de Exception)
HResult

Recebe ou define HRESULT, um valor numérico codificado atribuído a uma exceção específica.

(Herdado de Exception)
InnerException

Obtém a Exception instância que causou a exceção atual.

(Herdado de Exception)
Message

Recebe uma mensagem que descreve a exceção atual.

(Herdado de Exception)
Source

Obtém ou define o nome do aplicativo ou o objeto que causa o erro.

(Herdado de Exception)
StackTrace

Obtém uma representação string dos frames imediatos na stack de chamadas.

(Herdado de Exception)
TargetSite

Obtém o método que lança a exceção atual.

(Herdado de Exception)

Métodos

Name Description
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetBaseException()

Quando sobrescrito numa classe derivada, devolve o Exception que é a causa raiz de uma ou mais exceções subsequentes.

(Herdado de Exception)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetObjectData(SerializationInfo, StreamingContext)

Quando sobreposto numa classe derivada, define a SerializationInfo informação com sobre a exceção.

(Herdado de Exception)
GetType()

Obtém o tipo de execução da instância atual.

(Herdado de Exception)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ToString()

Cria e devolve uma representação string da exceção atual.

(Herdado de Exception)

evento

Name Description
SerializeObjectState

Ocorre quando uma exceção é serializada para criar um objeto de estado de exceção que contém dados serializados sobre a exceção.

(Herdado de Exception)

Aplica-se a

Ver também