Ne ThreadAbortException encore de faire respecter l'exécution du code dans enfin (try/catch) l'article?

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

Question

J'ai un System.Timers.Timer minuterie qui c'est AutoReset est fixé à false.J'utilise un try/finally pour assurer la je Start la minuterie à la fin de ce callback (J'utilise le timer de cette manière pour éviter le chevauchement de callback d'exécution).Code:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

Ma question est de savoir ce qui se passe si le thread qui s'exécute est Aborted?L' finally section encore exécuté ou s'il n'y a pas de fil pour exécuter la partie?

Était-ce utile?

La solution

Oui, cette ligne sera toujours exécutée et l'abandon bloqué jusqu'à ce que le code de la finally la clause de finitions.

Autres conseils

La source officielle...

Lorsqu'un appel est effectué à l'Abandon méthode pour détruire un thread, la commune language runtime jette un ThreadAbortException.ThreadAbortException est un spécial exception qui peut être pris, mais il sera automatiquement soulevé de nouveau à la fin du bloc catch.Lorsque cette une exception est déclenchée, le moteur d'exécution exécute tous les blocs avant se terminant le fil.Parce que le fil pouvez faire une surabondance de calcul dans le enfin, les blocs ou appel Fil de discussion.ResetAbort pour annuler la commande d'interruption, il n'ya aucune garantie que le thread ne sera jamais la fin.Si vous voulez attendre jusqu'à ce que le avorté thread est terminé,la vous pouvez appeler le Fil.Méthode de participation.Join est un appel de blocage qui n'a pas de retour jusqu'à ce que le thread s'arrête en cours d'exécution.

En savoir plus sur MSDN.

Dit-le la documentation (empahsis le mien):

Lorsque cette méthode est appelée sur un fil, le système déclenche une ThreadAbortException dans le fil de l'abandonner.ThreadAbortException est une exception spéciale, qui peut être pris par le code de l'application, mais est relancée à la fin du bloc catch sauf ResetAbort est appelé.ResetAbort annule la demande d'avorter, et empêche la ThreadAbortException par la fin du thread. Non, enfin, les blocs sont exécutés avant que le thread est interrompu.

Le fil n'est pas garanti pour abandonner immédiatement, ou à tous les.Cette situation peut se produire si un fil d'une la surabondance de la quantité de calcul dans les blocs qui sont appelés dans le cadre de l'abandon de la procédure, et , ainsi, indéfiniment retarder l'abandon.Attendre jusqu'à ce qu'un thread a été interrompu, vous pouvez appeler la méthode Join sur le fil après l'appel de la méthode Abort, mais il n'y a aucune garantie que l'attente va prendre fin.

Donc la réponse est oui, enfin les blocs seront exécutées.

Oui l' finally sera toujours utilisé n'importe comment, il quitte l' 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.

Lire plus sur MSDN.

si le thread a déjà été annulée, le bloc catch et le bloc finally peut continuer à exécuter.

Veuillez consulter ce lien pour obtenir une image claire sur la façon dont elle est traitée dans le système.le filetage de la classe Plomberie les Profondeurs de la ThreadAbortException

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top