2009-06-28 26 views
10

Busco una forma de reiniciar un hilo que ha sido detenido por Abortar() ..Reinicio de un hilo en .NET (usando C#)

public partial class MyProgram : Form 
{ 
    private Thread MyThread = new Thread(MyFunction); 
    private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button(); 
    public MyProgram() 
    { 
    MyThread.Start(); 
    startStopBtn += new EventHandler(doStop); 
    startStopBtn.Text = "Stop"; 
    } 
    private static void MyFunction() 
    { 
    // do something 
    } 
    private void doStop(object sender, EventArgs e) 
    { 
    MyThread.Abort(); 
    startStopBtn -= new EventHandler(doStop); 
    startStopBtn += new EventHandler(doStart); 
    startStopBtn.Text = "Start"; 
    } 
    private void doStart(object sender, EventArgs e) 
    { 
    MyThread.Start(); // << Error returned when clicking the button for 2nd time 
    startStopBtn -= new EventHandler(doStart); 
    startStopBtn += new EventHandler(doStop); 
    startStopBtn.Text = "Stop"; 
    } 
} 

Alguna idea?

Respuesta

12

Simplemente agregue MyThread = new Thread (MyFunction) antes de llamar a MyThread.Start() en doStart(). No cree el hilo fuera de sus métodos, el espacio está pensado para declaraciones.

EDITAR: Tenga en cuenta que matar a un hilo con hilo.Abortar() puede ser muy peligroso. Debes tratar de lograr un multihilo limpio, como lo describió Groo en su publicación.

+0

Esta respuesta es más una solución que una respuesta real. ni siquiera explica por qué tiene un error. Groo lo hizo bien. – Trap

+3

Tienes razón, pero cuando era un principiante de programación, tuve varios problemas similares. Estaba leyendo muchas soluciones como la de groo, y sí, tiene toda la razón, mi solución es solo una solución alternativa. Pero los mecanismos que Groo describe son demasiado complejos para que yo los entienda en mi programación, en tiempos nuevos. Así que, creo que sería mejor proporcionar una simple "respuesta" (o solución) para un programador no tan experimentado. – Emiswelt

+0

Esto es lo que hace que los programadores sean malos. No invierten suficiente tiempo para entender lo que están haciendo. o va a limpiar tu hilo. ¿Es un desastre cuando no estás? –

2

No, no lo hay, pero ¿por qué querrías? Simplemente inicie un nuevo hilo, con el mismo ThreadStart, y el mismo parámetro (si hay alguno).

6

La respuesta simple es que no se puede. Una vez que se ha abortado un hilo, no puede reiniciarlo. Simplemente cree un método o algo que devuelva un objeto Thread tal como lo necesita. Cuando necesitas un hilo nuevo, simplemente obténgalo de ese método.

29

Una vez que haya abortado su hilo, no podrá volver a iniciarlo.

Pero su problema real es que está abortando su hilo. Debe never use Thread.Abort().

Si su hilo debe detenerse y continuarse varias veces, debe considerar el uso de otros mecanismos (como AutoResetEvent, por ejemplo).

[EDIT]

La solución más sencilla para abortar un hilo, como se ha mencionado por Ian Griffiths en el enlace anterior, es:

El enfoque siempre recomiendo es muy simple. Tenga un campo volatile bool que sea visible tanto para su hilo de trabajo como para su subproceso de interfaz de usuario. Si el usuario hace clic en cancelar, establece esta bandera. Mientras tanto, en su hilo de trabajo, pruebe la bandera de vez en cuando. Si ves que se establece, deja lo que estás haciendo.

Lo único que tiene que hacer para hacer que funcione correctamente, es la de reorganizar el método de fondo para que se ejecute en un bucle - por lo que se puede comprobar periódicamente si el indicador se ha establecido por una hilo diferente.

Si necesita tener pausa y reanudar la funcionalidad para el mismo hilo de trabajador, en lugar del simple volatile bool indicador de enfoque, podría ir por un enfoque un poco más complejo, una construcción de sincronización como AutoResetEvent. Estas clases también proporcionan una forma de poner el subproceso de trabajo en modo de suspensión durante un período de tiempo específico (o indefinido) entre las señales del subproceso de no trabajo.

This thread contiene un ejemplo concreto con los métodos de Inicio, Pausa, Reanudar y Detener. Observe cómo el ejemplo de Brannon nunca aborta el hilo. Solo activa un evento y luego espera a que el hilo termine con elegancia.

0

Si realmente necesita interrumpir la función de hilo y reanudar, debe establecer una condición y luego verificarla periódicamente durante el procesamiento.

Eso le permitiría dejar de procesar durante un cierto período de tiempo y luego reanudar.

He utilizado eventos y Espere llamadas para realizar una tarea similar.

0

La manera más fácil es no abortar el hilo.

-3

Realmente no entiendo por qué las personas proporcionan información si no saben que es correcta .. ¿Cómo puede un programador real suspender o detener el procesamiento de un hilo por algún tiempo y luego soltarlo y por lo tanto hacer el código vulnerable ... . @ Brad-- lo siento .. pero su idea no era bueno .. @Rhythmic - Es necesario trabajar en su manera de enfocar las cosas ..

bfree era algo correcto si la gente le consiguió la misma manera quería decir ... Solo necesita volver a declarar que ...

a continuación es el ejemplo:

Public Shared Sub ResetAbort() 

    Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) 

    YourThreadName.Start() 

    Thread.Sleep(2000) 

    YourThreadName.Abort() 

End Sub 

Ahora puede utilizar este Sub en cualquier lugar que desee para iniciar el hilo. Automáticamente abortará el hilo.

Si desea iniciar la rosca en Button1_Click() evento y detenerlo en Button2_Click() evento de utilizar este:

en Button1_Click (evento)

Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) 

    YourThreadName.Start() 

en Button2_Click() evento

YourThreadName.Start() 

haciendo de esta manera abortará su hilo donde quiera y lo inicializará de nuevo. También puede usar la propiedad YourThreadName.ThreadState.Running para comprobar si el hilo se está ejecutando o no (solo para evitar varias instancias del mismo hilo .....

+5

Corrija el formato. Además, mientras lo está editando, es posible que desee que sea un poco menos beligerante. Si bien no te gusta la palabra "no", * no puedes reiniciar un hilo abortado *. Lo que OP pidió no es posible. Además, Thread.Abort() se considera dañino. Hay formas mucho mejores de controlar la ejecución de subprocesos. No le sirves al que pregunta permitiendo que continúe haciendo cosas malas. Es mejor dar alternativas que satisfagan sus requisitos sin incurrir en el mismo riesgo. – Will

Cuestiones relacionadas