Wie kann man einen Thread in C # sofort beenden?

Ich verwende die thread.Abort Methode, um den Thread zu thread.Abort , aber es funktioniert nicht. Gibt es eine andere Möglichkeit, den Thread zu beenden?

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

Ich benutze dies, aber jedes Mal, wenn ich den Status Alive bekomme, ist Receiver mein globaler Thread.

   

Der Grund, warum es schwierig ist, einen Thread einfach zu beenden, liegt darin, dass die Sprachdesigner das folgende Problem vermeiden möchten: Ihr Thread nimmt eine Sperre und Sie töten ihn dann, bevor er ihn freigeben kann. Jetzt wird jeder, der diese Sperre benötigt, stecken bleiben.

Was Sie tun müssen, ist eine globale Variable zu verwenden, um den Thread anzuhalten. Sie müssen manuell in Ihrem Thread-Code überprüfen, dass globale Variable und zurückgeben, wenn Sie sehen, dass Sie aufhören sollten.

Sie können sofort töten, indem Sie es auf diese Weise tun:

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

Ich benutze es immer und arbeite für mich 🙂

Sie sollten zuerst eine vereinbarte Methode haben, den Thread zu beenden. Zum Beispiel eine running_valiable, die der Thread überprüfen und einhalten kann.

Ihr Haupt-Thread-Code sollte in einen Ausnahmeblock eingeschlossen werden, der sowohl ThreadInterruptException als auch ThreadAbortException abfängt, wodurch der Thread beim Beenden sauber aufgeräumt wird.

Im Fall von ThreadInterruptException können Sie die Variable running_ überprüfen, um zu sehen, ob Sie fortfahren sollten. Im Falle der ThreadAbortException sollten Sie sofort aufräumen und die Thread-Prozedur beenden.

Der Code, der versucht, den Thread zu beenden, sollte folgendermaßen vorgehen:

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

Der Thread wird beendet, wenn er seine Arbeit beendet hat. Wenn Sie also Schleifen oder etwas anderes verwenden, sollten Sie eine Variable an den Thread übergeben, um die Schleife zu stoppen. Danach wird der Thread beendet.

C # Thread.Abort garantiert NICHT, den Thread sofort abzubrechen. Es wird wahrscheinlich funktionieren, wenn ein Thread Abort für sich selbst aufruft, aber nicht, wenn ein Thread einen anderen aufruft.

Bitte beachten Sie die Dokumentation: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

Ich habe dieses Problem mit dem Schreiben von Werkzeugen konfrontiert, die mit der Hardware interagieren – Sie möchten sofort stoppen, aber es ist nicht garantiert. Ich benutze normalerweise einige Flags oder andere solche Logik, um die Ausführung von Code-Teilen zu verhindern, die auf einem Thread ausgeführt werden (und die ich bei Abbruch nicht ausführen möchte – tricky).

  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(); }