2011-07-05 16 views
8

Creo un nuevo hilo y lo comienzo desde un hilo principal.Cómo iniciar un hilo detenido

m_MyThread = new Thread(HandleMyThread); 
m_MyThread.IsBackground = true; 
m_MyThread.Start(); 

private void HandleMyThread() 
{ 
    while (true) 
    { 
     Thread.Sleep(5000); 
     return; 
    } 
} 

Después de 5 segundos, este hilo finalizará y su ThreadState está detenido. Quiero empezar de nuevo cuando el usuario hace clic en el botón, pero me sale un ThreadStateException (Thread is running or terminated; it cannot restart):

private void button1_Click(object sender, EventArgs e) 
{ 
    m_MyThread.Start(); // ->raise exception 
} 

favor me ayude cómo reiniciar un hilo detenido. Gracias.

+1

Para obtener información adicional para detener un hilo de mi pregunta: [Forma correcta de detener un trabajo con hebras] (http://stackoverflow.com/questions/5146186/proper-way-to-stop-a-threaded- forzado por el trabajo) – Gerard

Respuesta

2

Si desea reutilizar el hilo sin un nuevo hilo cada vez, puede considerar la implementación del grupo de subprocesos.

+0

Pero de 2 maneras, ¿cuál es la mejor manera porque quiero volver a utilizar el hilo. Por favor díganme las ventajas y desventajas de 2 maneras. –

1

Simplemente haga un nuevo hilo como lo hizo cuando creó inicialmente el hilo. También es posible que desee extraer eso en un método para evitar que se repita.

3

Utilice ManualResetEvent, y en lugar de Thread.Sleep, espere el evento con un tiempo de espera agotado.

Luego, cualquier otro hilo puede activar el evento e inmediatamente reanudar el hilo de dormir.

Una vez que sale un hilo, ya no se puede ejecutar. Entonces no lo dejes salir En cambio, póngalo de nuevo a dormir esperando un evento.

+0

Tengo un problema en mi aplicación. Cuando ejecuto mi aplicación, necesito crear un hilo que duerma hasta las próximas 8 h AM para plantear un evento. Por favor, dame la forma de resolverlo. Por el momento, creo un hilo y calculo milisegundos desde ahora hasta las 8h AM para que duerma en la duración de este tiempo. Después de terminar de dormir, se planteará un evento. ¿Tienes algún ideal sobre mi camino? Gracias. –

8

Sé que esta pregunta es un poco antigua, pero pensé que podría publicar una respuesta en caso de que otros vengan aquí.

Para este código de ejemplo, si se cambia a tener este aspecto:

Thread m_MyThread; 
private void HandleMyThread() 
{ 
    while (true) 
    { 
     Thread.Sleep(5000); 
     return; 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (!m_MyThread.IsAlive) 
    { 
     m_MyThread = new Thread(HandleMyThread); 
     m_MyThread.IsBackground = true; 
     m_MyThread.Start(); 
    } 
} 

Esto crearía una nueva instancia de la rosca y ponerlo en marcha. El error ThreadStateException se debe a que, simplemente, no puede volver a iniciar un subproceso que está detenido. m_MyThread.Start() solo es válido para los hilos en el estado Unstarted. Lo que se necesita hacer en casos como este es crear una nueva instancia de hilo e invocar Start() en la nueva instancia.

0

Para reiniciar un hilo, intente esto:

private void button1_Click(object sender, EventArgs e) 
{ 
    // Just create a new constructor for the stopped Thread 
    m_MyThread = null; 
    m_MyThread = new Thread(HandleMyThread); 
    m_MyThread.IsBackground = true; 
    // Then restart the stopped Thread 
    m_MyThread.Start(); 
} 

Esto funciona si el hilo se detuvo anteriormente.

+0

Esta es la misma solución que ya dio Daniel Winks (http://stackoverflow.com/a/8568206/2029849) – abto

Cuestiones relacionadas