Threkabortexception impone ancora a eseguire l'esecuzione del codice nella sezione infine (try / catch)?

StackOverflow https://stackoverflow.com/questions/6099382

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top