Come uccidere un thread istantaneamente in C #?

Sto usando il thread.Abort Metodo thread.Abort per uccidere il thread, ma non funziona. C’è un altro modo per terminare il thread?

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

Sto usando questo, ma ogni volta che ottengo lo stato di Alive , Receiver è il mio thread globale.

Il motivo per cui è difficile uccidere un thread è perché i progettisti di linguaggio vogliono evitare il seguente problema: il thread prende un blocco e quindi lo uccide prima che possa rilasciarlo. Ora chiunque abbia bisogno di quella serratura rimarrà bloccato.

Quello che devi fare è usare alcune variabili globali per dire al thread di fermarsi. Devi manualmente, nel tuo codice thread, controllare che la variabile globale e tornare se lo vedi indica che devi fermarti.

Puoi uccidere immediatamente facendolo in questo modo:

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

Lo uso sempre e lavora per me 🙂

Dovresti prima avere un metodo concordato per terminare il thread. Ad esempio un running_valido che il thread può controllare e rispettare.

Il codice del thread principale deve essere racchiuso in un blocco di eccezioni che raccolga sia ThreadInterruptException che ThreadAbortException che ripuliranno in modo pulito il thread all’uscita.

Nel caso di ThreadInterruptException è ansible controllare la variabile running_ per vedere se è necessario continuare. Nel caso di ThreadAbortException, è necessario riordinare immediatamente e uscire dalla procedura di thread.

Il codice che tenta di interrompere il thread dovrebbe effettuare quanto segue:

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

il thread verrà ucciso quando termina il suo funzionamento, quindi se stai usando loop o qualcos’altro dovresti passare una variabile al thread per fermare il ciclo dopo che il thread sarà finito.

C # Thread.Abort NON è garantito per interrompere istantaneamente il thread. Probabilmente funzionerà quando un thread chiama Abort su se stesso ma non quando un thread chiama su un altro.

Fare riferimento alla documentazione: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

Ho affrontato questo problema scrivendo strumenti che interagiscono con l’hardware: si desidera interrompere immediatamente, ma non è garantito. Di solito uso alcuni flag o altre logiche di questo tipo per impedire l’esecuzione di parti di codice in esecuzione su un thread (e che non voglio essere eseguito su abort-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(); }