Condividi tramite


Distruzione di thread

Il metodo Abort viene utilizzato per interrompere definitivamente un thread gestito. Quando si chiama Abort, Common Language Runtime genera un'eccezione ThreadAbortException nel thread di destinazione, che può intercettare l'eccezione. Per ulteriori informazioni, vedere Thread.Abort.

NotaNota

Se un thread sta eseguendo codice non gestito al momento della chiamata al relativo metodo Abort, Common Language Runtime contrassegna il thread come ThreadState.AbortRequested.L'eccezione viene generata quando il thread restituisce il controllo al codice gestito.

I thread terminati non possono essere riavviati.

Il metodo Abort non provoca l'interruzione immediata del thread perché il thread di destinazione può intercettare l'eccezione ThreadAbortException ed eseguire quantità arbitrarie di codice in un blocco finally. Se necessario, è possibile rimanere in attesa finché il thread non termina chiamando Thread.Join. Thread.Join rappresenta una chiamata di blocco che non restituisce il controllo prima che il thread abbia effettivamente interrotto l'esecuzione o sia trascorso un intervallo di timeout facoltativo. Poiché il thread interrotto può chiamare il metodo ResetAbort o procedere con un'elaborazione illimitata in un blocco finally, non è possibile garantire che l'attesa termini senza specificare un timeout.

I thread in attesa su una chiamata al metodo Thread.Join possono essere interrotti da altri thread che chiamano Thread.Interrupt.

Gestione di ThreadAbortException

Se si prevede che il thread verrà interrotto per effetto di una chiamata a Abort dal codice o a causa dello scaricamento di un dominio applicazione in cui il thread è in esecuzione (AppDomain.Unload utilizza Thread.Abort per interrompere i thread), è necessario che il thread gestisca l'eccezione ThreadAbortException ed esegua tutta l'elaborazione finale in una clausola finally, come illustrato nel codice riportato di seguito.

Try
    ' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
    ' Clean-up code can go here.
    ' If there is no Finally clause, ThreadAbortException is
    ' re-thrown by the system at the end of the Catch clause. 
Finally
    ' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception 
' is rethrown at the end of the Finally clause.
try 
{
    // Code that is executing when the thread is aborted.
} 
catch (ThreadAbortException ex) 
{
    // Clean-up code can go here.
    // If there is no Finally clause, ThreadAbortException is
    // re-thrown by the system at the end of the Catch clause. 
}
// Do not put clean-up code here, because the exception 
// is rethrown at the end of the Finally clause.

Il codice di pulitura deve essere incluso nella clausola catch o finally, perché, se non esiste alcuna clausola finally, il sistema genera nuovamente un'eccezione ThreadAbortException alla fine della clausola finally o catch.

È possibile impedire al sistema di rigenerare l'eccezione chiamando il metodo Thread.ResetAbort. Tuttavia, questa operazione deve essere eseguita solo se la generazione di ThreadAbortException è dovuta al codice.

Vedere anche

Riferimenti

ThreadAbortException

Thread

Altre risorse

Utilizzo di thread e threading