Thread.Abort vs Thread.Interrupt

Si je dois annuler une opération sur un thread, quand dois-je utiliser Thread.Abort vs Thread.Interrupt . J’ai lu la documentation à ce sujet, mais je ne savais pas quel scneario devrais-je utiliser un appel particulier entre deux.

S’il existe une troisième façon de le faire, merci de me le faire savoir aussi avec les avantages et les inconvénients.

Je voudrais éviter d’utiliser Thread.Abort à tout prix. Son comportement est beaucoup plus sûr et prévisible depuis .NET 2.0, mais il comporte encore quelques pièges assez sérieux. La plupart des interruptions dans le code géré peuvent être sécurisées, mais pas toutes. Par exemple, je crois qu’il existe certains problèmes subtils si une demande d’abandon est déclenchée pendant le traitement d’un constructeur statique. Peu importe, le fait que l’exception hors bande puisse se produire à tout moment vous laisse peu de contrôle sur la définition des emplacements des points sûrs pour l’arrêt.

Il existe plusieurs façons acceptables de terminer un thread de manière élégante.

  • Utilisez Thread.Interrupt
  • Interroger un drapeau d’arrêt
  • Utiliser les événements WaitHandle
  • Appels API spécialisés

Je discute de ces méthodes dans ma réponse ici .

La plupart des suggestions sont déjà faites, mais voici un exemple de ce que je ferais:

  ManualResetEvent _requestTermination = new ManualResetEvent(false); Thread _thread; public void Init() { _thread = new Thread(() => { while (!_requestTermination.WaitOne(0)) { // do something usefull } })); _thread.Start(); } public void Dispose() { _requestTermination.Set(); // you could enter a maximum wait time in the Join(...) _thread.Join(); } 

De cette façon, la disposition attendra que le thread se soit terminé.

Je ne voudrais pas utiliser Thread.Abort jamais. Cela provoque une exception à un moment presque arbitraire.

Soyez prudent avec Thread.Interrupt . Si vous ne créez pas de temps d’attente ou de sumil, le fil de discussion ne sera pas interrompu.

Soyez prudent avec Thread.Abort . Si vous attrapez l’ ThreadAbortException votre thread se terminera juste après catch +.

(J’aime utiliser ces méthodes pour envoyer un signal à mon thread afin qu’il sache que l’heure de la fin est terminée, puis nettoyez et quittez.)