LockRecursionException Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Eccezione che viene generata quando una voce ricorsiva in un blocco non è compatibile con i criteri di ricorsione per il blocco stesso.
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
- Ereditarietà
- Attributi
Esempio
Nell'esempio seguente vengono illustrate due cause di LockRecursionException quando si usa la ReaderWriterLockSlim classe . Il programma crea un ReaderWriterLockSlim usando il costruttore senza parametri, che impedisce la ricorsione. Il programma avvia quindi un thread che entra nel blocco in modalità di lettura. Il thread tenta di immettere il blocco in modo ricorsivo in modalità di lettura e rileva l'eccezione risultante. Infine, il thread tenta di immettere la modalità di scrittura, che creerebbe un potenziale per i deadlock. Il thread rileva l'eccezione risultante.
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, tra cui quanto segue:
Se un thread tenta di immettere un'istanza ricorsiva ReaderWriterLockSlim , ma l'istanza non supporta la ricorsione.
Se un thread tenta di immettere un'istanza ReaderWriterLockSlim in modalità di scrittura o in modalità aggiornabile quando il thread ha inizialmente immesso il blocco in modalità di lettura. Ciò rappresenta un potenziale deadlock e pertanto non è consentito.
Se si consente un altro livello di ricorsione, il valore massimo per il contatore di archiviazione interno usato per tenere traccia delle ricorsioni. Questo limite è talmente elevato che le applicazioni non dovrebbero mai raggiungerlo.
Costruttori
LockRecursionException() |
Inizializza una nuova istanza della classe LockRecursionException con un messaggio di sistema che descrive l'errore. |
LockRecursionException(SerializationInfo, StreamingContext) |
Inizializza una nuova istanza della classe LockRecursionException con dati serializzati. |
LockRecursionException(String) |
Inizializza una nuova istanza della classe LockRecursionException con un messaggio specificato che descrive l'errore. |
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. |
Proprietà
Data |
Ottiene una raccolta di coppie chiave/valore che forniscono informazioni definite dall'utente aggiuntive sull'eccezione. (Ereditato da Exception) |
HelpLink |
Ottiene o imposta un collegamento al file della Guida associato all'eccezione. (Ereditato da Exception) |
HResult |
Ottiene o imposta HRESULT, un valore numerico codificato che viene assegnato a un'eccezione specifica. (Ereditato da Exception) |
InnerException |
Ottiene l'istanza di Exception che ha causato l'eccezione corrente. (Ereditato da Exception) |
Message |
Ottiene un messaggio che descrive l'eccezione corrente. (Ereditato da Exception) |
Source |
Ottiene o imposta il nome dell'oggetto o dell'applicazione che ha generato l'errore. (Ereditato da Exception) |
StackTrace |
Ottiene una rappresentazione di stringa dei frame immediati nello stack di chiamate. (Ereditato da Exception) |
TargetSite |
Ottiene il metodo che genera l'eccezione corrente. (Ereditato da Exception) |
Metodi
Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (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. (Ereditato da Exception) |
GetHashCode() |
Funge da funzione hash predefinita. (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. (Ereditato da Exception) |
GetType() |
Ottiene il tipo di runtime dell'istanza corrente. (Ereditato da Exception) |
MemberwiseClone() |
Crea una copia superficiale dell'oggetto Object corrente. (Ereditato da Object) |
ToString() |
Crea e restituisce una rappresentazione di stringa dell'eccezione corrente. (Ereditato da Exception) |
Eventi
SerializeObjectState |
Obsoleta.
Si verifica quando un'eccezione viene serializzata per creare un oggetto di stato eccezione contenente i dati serializzati relativi all'eccezione. (Ereditato da Exception) |