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 generata quando l'immissione ricorsiva in un blocco non è compatibile con i criteri di ricorsione per il blocco.
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 oggetto usando il costruttore senza parametri, che non consente 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 intercetta l'eccezione risultante. Infine, il thread tenta di accedere alla modalità di scrittura, che potrebbe creare un potenziale di deadlock. Il thread intercetta 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:
Se un thread tenta di immettere un'istanza di ReaderWriterLockSlim in modo ricorsivo, ma l'istanza non supporta la ricorsione.
Se un thread tenta di accedere a un'istanza ReaderWriterLockSlim in modalità di scrittura o 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 è così grande che le applicazioni non devono mai incontrarlo.
Costruttori
| Nome | Descrizione |
|---|---|
| LockRecursionException() |
Inizializza una nuova istanza della classe LockRecursionException con un messaggio fornito dal sistema che descrive l'errore. |
| LockRecursionException(SerializationInfo, StreamingContext) |
Inizializza una nuova istanza della classe LockRecursionException con dati serializzati. |
| 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 di questa eccezione. |
| LockRecursionException(String) |
Inizializza una nuova istanza della classe LockRecursionException con un messaggio specificato che descrive l'errore. |
Proprietà
| Nome | Descrizione |
|---|---|
| Data |
Ottiene una raccolta di coppie chiave/valore che forniscono informazioni aggiuntive definite dall'utente sull'eccezione. (Ereditato da Exception) |
| HelpLink |
Ottiene o imposta un collegamento al file della Guida associato a questa eccezione. (Ereditato da Exception) |
| HResult |
Ottiene o imposta HRESULT, valore numerico codificato assegnato a un'eccezione specifica. (Ereditato da Exception) |
| InnerException |
Ottiene l'istanza 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'applicazione o dell'oggetto che causa l'errore. (Ereditato da Exception) |
| StackTrace |
Ottiene una rappresentazione di stringa dei fotogrammi immediati nello stack di chiamate. (Ereditato da Exception) |
| TargetSite |
Ottiene il metodo che genera l'eccezione corrente. (Ereditato da Exception) |
Metodi
| Nome | Descrizione |
|---|---|
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| GetBaseException() |
Quando sottoposto a override in una classe derivata, restituisce l'oggetto Exception che rappresenta la causa radice di una o più eccezioni successive. (Ereditato da Exception) |
| GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
In caso di override in una classe derivata, imposta con le SerializationInfo informazioni sull'eccezione. (Ereditato da Exception) |
| GetType() |
Ottiene il tipo di runtime dell'istanza corrente. (Ereditato da Exception) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| ToString() |
Crea e restituisce una rappresentazione di stringa dell'eccezione corrente. (Ereditato da Exception) |
Eventi
| Nome | Descrizione |
|---|---|
| SerializeObjectState |
Si verifica quando viene serializzata un'eccezione per creare un oggetto stato dell'eccezione contenente dati serializzati sull'eccezione. (Ereditato da Exception) |