Comment tuer un thread instantanément en C #?

J’utilise la méthode thread.Abort pour tuer le thread, mais cela ne fonctionne pas. Existe-t-il un autre moyen de terminer le fil?

 private void button1_Click(object sender, EventArgs e) { if (Receiver.IsAlive == true) { MessageBox.Show("Alive"); Receiver.Abort(); } else { MessageBox.Show("Dead"); Receiver.Start(); } } 

Je l’utilise mais chaque fois que j’obtiens le statut Alive , Receiver est mon fil de discussion global.

La raison pour laquelle il est difficile de tuer un thread est que les concepteurs de langage veulent éviter le problème suivant: votre thread prend un verrou, puis vous le tuez avant de pouvoir le libérer. Maintenant, toute personne qui a besoin de cette serrure sera bloquée.

Ce que vous devez faire est d’utiliser une variable globale pour indiquer au thread de s’arrêter. Vous devez manuellement, dans votre code de thread, vérifier cette variable globale et retourner si vous voyez que cela indique que vous devez vous arrêter.

Vous pouvez tuer instantanément en le faisant de cette façon:

 private Thread _myThread = new Thread(SomeThreadMethod); private void SomeThreadMethod() { // do whatever you want } [SecurityPermissionAtsortingbute(SecurityAction.Demand, ControlThread = true)] private void KillTheThread() { _myThread.Abort(); } 

Je l’utilise toujours et travaille pour moi 🙂

Vous devriez d’abord avoir une méthode convenue pour mettre fin au thread. Par exemple un running_ valiable que le thread peut vérifier et respecter.

Votre code de thread principal doit être encapsulé dans un bloc d’exception qui intercepte à la fois ThreadInterruptException et ThreadAbortException qui va proprement nettoyer le thread à la sortie.

Dans le cas de ThreadInterruptException, vous pouvez vérifier la variable running_ pour voir si vous devez continuer. Dans le cas de ThreadAbortException, vous devez nettoyer immédiatement et quitter la procédure de thread.

Le code qui tente d’arrêter le thread doit procéder comme suit:

 running_ = false; threadInstance_.Interrupt(); if(!threadInstance_.Join(2000)) { // or an agreed resonable time threadInstance_.Abort(); } 

thread sera tué quand il finira son travail, donc si vous utilisez des boucles ou quelque chose d’autre, vous devriez passer variable au thread pour arrêter la boucle après que le thread sera terminé.

C # Thread.Abort n’est PAS garanti pour interrompre le thread instantanément. Cela fonctionnera probablement quand un thread appelle Abort sur lui-même mais pas quand un thread appelle sur un autre.

Veuillez vous référer à la documentation: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

J’ai rencontré ce problème en écrivant des outils qui interagissent avec le matériel – vous voulez un arrêt immédiat, mais ce n’est pas garanti. J’utilise généralement des drapeaux ou une autre logique de ce type pour empêcher l’exécution de parties de code s’exécutant sur un thread (et que je ne souhaite pas exécuter en cas d’abandon).

  private void ResumeButton_Click(object sender, RoutedEventArgs e) { Task.Factory.StartNew(() => { Application.Current.Resources["AutoPilotThreadStatus"] = true; Thread.CurrentThread.Name = "ResumeAutoPilot"; Thread.CurrentThread.IsBackground = true; AutoPilotHandler.ResumeAutoPilot(); }); } public static void ResumeAutoPilot() { while ((bool)Application.Current.Resources["AutoPilotThreadStatus"]) { CheckAutoPilotThreadStatus(); var searchYoutube = YoutubeHandler.Search("small truck"); CheckAutoPilotThreadStatus(); SaveVideosToDatabase(searchYoutube); CheckAutoPilotThreadStatus(); } } public static void CheckAutoPilotThreadStatus() { if (!(bool)Application.Current.Resources["AutoPilotThreadStatus"]) { KillCurrentThread(); } } public static void KillCurrentThread() { Thread.CurrentThread.Abort(); }