thread terminar stop parametros hilos esperar detener con c# winforms multithreading

terminar - hilos en c#



Cómo matar un hilo al instante en C#? (6)

C # Thread.Abort NO se garantiza que aborte el hilo instantáneamente. Probablemente funcione cuando un hilo llama Abort en sí mismo, pero no cuando un hilo llama a otro.

Consulte la documentación: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

Me he enfrentado a este problema al escribir herramientas que interactúan con el hardware; desea detenerlo de inmediato, pero no está garantizado. Normalmente utilizo algunos indicadores u otra lógica para evitar la ejecución de partes de código que se ejecutan en un hilo (y que no quiero que se ejecuten en abortar - complicado).

Estoy usando el método thread.Abort para matar el hilo, pero no funciona. ¿Hay alguna otra manera de terminar el hilo?

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

Estoy usando esto, pero cada vez que obtengo el estado Alive , Receiver es mi hilo global.


La razón por la que es difícil matar un hilo es porque los diseñadores del lenguaje quieren evitar el siguiente problema: el hilo se cierra y luego lo mata antes de poder liberarlo. Ahora cualquiera que necesite ese bloqueo se quedará atascado.

Lo que tienes que hacer es usar alguna variable global para indicar al hilo que se detenga. Usted tiene que manualmente, en su código de hilo, verificar esa variable global y regresar si lo ve que indica que debe detenerse.


Primero debe tener algún método acordado para finalizar el hilo. Por ejemplo, un running_ valiable que el hilo puede verificar y cumplir.

El código del hilo principal debe estar envuelto en un bloque de excepción que atrape tanto a ThreadInterruptException como a ThreadAbortException, que limpiarán limpiamente el hilo al salir.

En el caso de ThreadInterruptException puede verificar la variable running_ para ver si debe continuar. En el caso de ThreadAbortException, debe ordenar inmediatamente y salir del procedimiento de subprocesos.

El código que intenta detener el hilo debe hacer lo siguiente:

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


Puedes matar instantáneamente haciéndolo de esa manera:

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

Siempre lo uso y funciona para mí :)


el hilo se eliminará cuando termine su trabajo, por lo que si está utilizando bucles u otra cosa, debe pasar variable al hilo para detener el ciclo una vez que el hilo habrá finalizado.


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