Question

Lorsque j'abandonne l'exécution d'un thread, je doute toujours entre une sortie en douceur avec un gestionnaire d'événements comme celui-ci:

int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
  FinalizeAndExit();

et en utilisant l'événement pour signaler au thread qu'il doit se terminer

ou simplement en manipulant l'exception ThreadAbortException pour finaliser le fil ...

try
{
  // Main execution
}
catch(ThreadAbortException e)
{
  // FinalizeAndExit();
}
finally
{
}

Je suis généralement enclin à utiliser l'approche ThreadAbortException car elle peut être gérée mais elle est re-levée à la fin du bloc catch et évite également que le fil ne soit maintenu en vie par "perfide". méthodes, mais j'ai vu les deux approches.

Quel est votre avis? Existe-t-il des situations dans lesquelles il est préférable d’utiliser un système plutôt qu’un autre, ou est-il préférable d’utiliser toujours l'approche x?

Était-ce utile?

La solution

Généralement, la première méthode est préférable.

Il est difficile (voire impossible) d’écrire du code qui gérera toujours une exception ThreadAbortException avec élégance. L’exception peut se produire au milieu de la tâche exécutée par le fil, de sorte que certaines situations peuvent être difficiles à gérer.

Par exemple, l'exception peut se produire après la création d'un objet FileStream, mais avant l'attribution de la référence à une variable. Cela signifie que vous avez un objet à supprimer, mais que la seule référence à celui-ci est perdue quelque part sur la pile ...

Autres conseils

Si je le peux, j'essaie d'éviter d'utiliser Thread.Abort. Le problème avec Thread.Abort est que cela peut se produire dans (presque) toutes les lignes du code en cours d’exécution et provoquer des erreurs "intéressantes". comportement (lire: bugs). Intead, je préfère avoir un point de sortie sur mon code qui recherche un événement ou une variable pour voir si le thread doit cesser de s'exécuter et se fermer normalement.

Si l'événement de terminaison est prévu, il ne s'agit certainement pas d'une exception (au sens strict du terme), vous devez donc utiliser la première méthode. Une sortie en douceur montre également que vous avez le contrôle.

Bien que les exceptions soient utiles et dans certains cas nécessaires, elles peuvent être utilisées de manière abusive.

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