2008-09-06 5 views
2

Dans mon programme C#, j'ai un thread qui représente un test en cours, qui peut être interrompu par un clic sur un bouton intitulé "Interrupt execution". Pour que le fil (et donc le test) se termine de façon élégante (et fasse un travail vital à l'avance), ce bouton n'est activé que dans certains moments bien définis, dans lesquels j'attrape ThreadAbortedException, fais Thread.ResetAbort() et meurs magnifiquement (c'est-à-dire, le fil). Le problème est que, dans la fenêtre de temps où l'abandon est possible, il y a certaines tâches qui doivent être effectuées du début à la fin une fois initiées, et, donc, je crains TAE. Serrures ne fournissent pas une solution pour cela, et, bien que finalement les blocs font, je ne trouve pas élégant pour envelopper le code important de la manière suivante:Existe-t-il un moyen d'assurer l'exécution complète du bloc de code dans un thread .NET?

try { 
} finally { 
    // vital code 
} 

Cependant, je ne trouve pas d'autre solution .

Est-ce une autre façon de retarder l'interférence de ThreadAbortException jusqu'à la fin du bloc?

Répondre

4

Les situations dans lesquelles une exception ThreadAbortException sera générée peuvent être complexes. Une meilleure option pourrait être de demander pourquoi vous utilisez ThreadAbortExceptions du tout. Un meilleur modèle serait simplement d'utiliser un drapeau pour indiquer au thread en cours d'exécution qu'il devrait abandonner, puis tester le drapeau régulièrement pendant qu'il travaille. Si elle est définie, vous pouvez lancer une exception à ce moment si vous le souhaitez.

Avec ce motif, vous avez totalement le contrôle du moment où le thread va agir sur l'abandon, et vous n'avez pas à vous soucier de l'interruption des opérations critiques.

3

utilisation Thread.BeginCriticalRegion()

notifie à un hôte que l'exécution est sur le point d'entrer dans une région de code dans lequel les effets d'un fil ou avorter exception non gérée pourrait compromettre d'autres tâches dans le domaine d'application.

Thread.BeginCriticalRegion() 

//do important stuff here 

Thread.EndCriticalRegion() 
+0

Bien que BeginCriticalRegion() pourrait, d'une manière, d'assurer l'exécution de code, parce que votre application pourrait arrêter autrement, je voulais un dispositif qui a refusé ThreadAbortExceptions d'interrompre mon code. –

Questions connexes