Threkabortexception impone ancora a eseguire l'esecuzione del codice nella sezione infine (try / catch)?
-
09-09-2020 - |
Domanda
Ho un timer System.Timers.Timer
che è AutoReset
è impostato su false
.Io uso un try/finally
per assicurare I Start
il timer alla fine del suo callback
(Io uso il timer in questo modo per evitare la sovrapposizione dell'esecuzione callback
).Codice:
// inside timer call back
try
{
// Do something
}
finally
{
timer.Start(); // Is this line always executed?
}
.
La mia domanda è ciò che accade se il thread di esecuzione è Aborted
?La sezione finally
ha ancora eseguito o non c'è filo per eseguire quella parte?
Soluzione
Sì, quella linea verrà sempre eseguita e l'abort bloccata fino a quando il codice nella clausola finally
finisce.
Altri suggerimenti
La fonte ufficiale ...
.Quando viene apportata una chiamata all'orbita Metodo per distruggere un filo, il comune Lingua Runtime lancia un Threadabortexception. Threhabortexception è uno speciale eccezione che può essere catturata, ma verrà automaticamente sollevato di nuovo a la fine del blocco di cattura.Quando questo L'eccezione è sollevata, il runtime esegue tutti i blocchi finalmente prima terminando il filo.Perché il filo. può fare un calcolo illimitato nel finalmente blocchi o chiamare Discussione.resetabort per cancellare l'abort, Non c'è garanzia che il filo finirà mai.Se vuoi aspettare fino a quando il filo abortito è finito, Puoi chiamare il metodo Thread.join. Iscriviti è una chiamata di blocco che non lo fa ritorno finché il filo non si ferma effettivamente Esecuzione.
Leggi di più su di esso su msdn .
Quoth the Documentazione (Empahsis mine):
.Quando questo metodo è invocato su un filo, il sistema lancia una breve tempesta di un thread in thread per abort. Diackabortexception è un'eccezione speciale che può essere catturata dal codice dell'applicazione, ma viene ri-lanciata alla fine del blocco di cattura a meno che non venga chiamato resetbort. ResetAbort annulla la richiesta di interrompere e impedisce a ThrehaBortexception di terminare il thread. I blocchi infine non riusciti sono eseguiti prima che il filo sia interrotto.
Il filo non è garantito per interrompere immediatamente, o affatto. Questa situazione può verificarsi se un thread fa una quantità di calcolo unbunded di calcolo nei blocchi finali che vengono chiamati come parte della procedura di interruzione , ritardando in tal modo indefinitamente l'abort. Per attendere fino a quando un thread è stato interrotto, è possibile chiamare il metodo di join sul thread dopo aver chiamato il metodo di interruzione, ma non c'è garanzia che l'attesa terminerà.
Quindi la risposta è sì, i blocchi finalmente verranno eseguiti.
Sì, il finally
verrà sempre utilizzato, non importa come esce da try
,
Whereas catch is used to handle exceptions that occur in a statement block, finally is used to guarantee a statement block of code executes regardless of how the preceding try block is exited..
Leggi di più su msdn .
Se il thread è già stato interrotto, il blocco di cattura e il blocco finalmente può continuare a essere eseguito.
Si prega di fare riferimento a questo collegamento per ottenere un'immagine chiara su come viene gestita in System.Threading Class impianto idraulico Le profondità della Threadabortexception