LockRecursionException Classe

Definizione

Eccezione che viene generata quando una voce ricorsiva in un blocco non è compatibile con i criteri di ricorsione per il blocco stesso.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
Ereditarietà
LockRecursionException
Attributi

Esempi

Nell'esempio seguente vengono illustrate due cause di LockRecursionException quando si utilizza la classe ReaderWriterLockSlim.The following example shows two causes of LockRecursionException when using the ReaderWriterLockSlim class. Il programma crea un ReaderWriterLockSlim usando il costruttore senza parametri, che non consente la ricorsione.The program creates a ReaderWriterLockSlim by using the parameterless constructor, which disallows recursion. Il programma avvia quindi un thread che accede al blocco in modalità lettura.The program then starts a thread that enters the lock in read mode. Il thread tenta di accedere al blocco in modo ricorsivo in modalità di lettura e rileva l'eccezione risultante.The thread tries to enter the lock recursively in read mode, and catches the resulting exception. Infine, il thread tenta di accedere alla modalità di scrittura, che creerebbe un potenziale deadlock.Finally, the thread tries to enter write mode, which would create a potential for deadlocks. Il thread intercetta l'eccezione risultante.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.
' 

Commenti

LockRecursionException viene generata per diversi motivi, inclusi i seguenti:LockRecursionException is thrown for several reasons, including the following:

  • Se un thread tenta di accedere a un'istanza di ReaderWriterLockSlim in modo ricorsivo, ma l'istanza non supporta la ricorsione.If a thread tries to enter an instance of ReaderWriterLockSlim recursively, but the instance does not support recursion.

  • Se un thread tenta di accedere a un'istanza di ReaderWriterLockSlim in modalità scrittura o in modalità aggiornabile quando il thread ha inizialmente attivato il blocco in modalità lettura.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. Questo rappresenta un potenziale deadlock e pertanto non è consentito.This represents a potential deadlock and therefore is not allowed.

  • Se consentire un ulteriore livello di ricorsione supererà il valore massimo per il contatore di archiviazione interno utilizzato per tenere traccia delle ricorsioni.If allowing one more level of recursion would exceed the maximum value for the internal storage counter used to track recursions. Questo limite è talmente elevato che le applicazioni non dovrebbero mai raggiungerlo.This limit is so large that applications should never encounter it.

Costruttori

LockRecursionException()

Inizializza una nuova istanza della classe LockRecursionException con un messaggio fornito dal sistema in cui viene descritto l'errore.Initializes a new instance of the LockRecursionException class with a system-supplied message that describes the error.

LockRecursionException(SerializationInfo, StreamingContext)

Inizializza una nuova istanza della classe LockRecursionException con dati serializzati.Initializes a new instance of the LockRecursionException class with serialized data.

LockRecursionException(String)

Inizializza una nuova istanza della classe LockRecursionException con un messaggio specificato in cui viene descritto l'errore.Initializes a new instance of the LockRecursionException class with a specified message that describes the error.

LockRecursionException(String, Exception)

Inizializza una nuova istanza della classe LockRecursionException con un messaggio di errore specificato e un riferimento all'eccezione interna che è la causa dell'eccezione corrente.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.

Proprietà

Data

Ottiene una raccolta di coppie chiave/valore che forniscono informazioni definite dall'utente aggiuntive sull'eccezione.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Ereditato da Exception)
HelpLink

Ottiene o imposta un collegamento al file della Guida associato all'eccezione.Gets or sets a link to the help file associated with this exception.

(Ereditato da Exception)
HResult

Ottiene o imposta HRESULT, un valore numerico codificato che viene assegnato a un'eccezione specifica.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Ereditato da Exception)
InnerException

Ottiene l'istanza di Exception che ha causato l'eccezione corrente.Gets the Exception instance that caused the current exception.

(Ereditato da Exception)
Message

Ottiene un messaggio che descrive l'eccezione corrente.Gets a message that describes the current exception.

(Ereditato da Exception)
Source

Ottiene o imposta il nome dell'oggetto o dell'applicazione che ha generato l'errore.Gets or sets the name of the application or the object that causes the error.

(Ereditato da Exception)
StackTrace

Ottiene una rappresentazione di stringa dei frame immediati nello stack di chiamate.Gets a string representation of the immediate frames on the call stack.

(Ereditato da Exception)
TargetSite

Ottiene il metodo che genera l'eccezione corrente.Gets the method that throws the current exception.

(Ereditato da Exception)

Metodi

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object.

(Ereditato da Object)
GetBaseException()

Quando ne viene eseguito l'override in una classe derivata, restituisce l'Exception che è la causa radice di una o più eccezioni successive.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Ereditato da Exception)
GetHashCode()

Funge da funzione hash predefinita.Serves as the default hash function.

(Ereditato da Object)
GetObjectData(SerializationInfo, StreamingContext)

Quando ne viene eseguito l'override in una classe derivata, imposta il controllo SerializationInfo con le informazioni sull'eccezione.When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Ereditato da Exception)
GetType()

Ottiene il tipo di runtime dell'istanza corrente.Gets the runtime type of the current instance.

(Ereditato da Exception)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Ereditato da Object)
ToString()

Crea e restituisce una rappresentazione di stringa dell'eccezione corrente.Creates and returns a string representation of the current exception.

(Ereditato da Exception)

Eventi

SerializeObjectState

Si verifica quando un'eccezione viene serializzata per creare un oggetto di stato eccezione contenente i dati serializzati relativi all'eccezione.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Ereditato da Exception)

Si applica a

Vedi anche