2010-03-12 14 views
9

Estoy haciendo una aplicación en C# que usa un winform como GUI y un hilo separado que se ejecuta en segundo plano y que cambia automáticamente las cosas. Ejemplo:¿Cómo pausar/suspender un hilo y luego continuar?

public void Run() 
{ 
    while(true) 
    { 
     printMessageOnGui("Hey"); 
     Thread.Sleep(2000); 
     // Do more work 
    } 
} 

¿Cómo puedo hacer que se detenga en cualquier punto del ciclo, porque una iteración del ciclo tarda unos 30 segundos. Así que no me gustaría detenerlo después de que haya terminado un ciclo, quiero detenerlo a tiempo.

Respuesta

14
ManualResetEvent mrse = new ManualResetEvent(false); 

public void run() 
{ 
    while(true) 
    { 
     mrse.WaitOne(); 
     printMessageOnGui("Hey"); 
     Thread.Sleep(2000); . . 
    } 
} 

public void Resume() 
{ 
    mrse.Set(); 
} 

public void Pause() 
{ 
    mrse.Reset(); 
} 
+1

Nota rápida: como está escrito, este ejemplo comenzará en el estado en pausa (como se indica en la línea 'new ManualResetEvent (false);'). Gracias @Lirik –

+0

también estoy enfrentando el mismo problema .. Muchas gracias @Lirik. tu alma también funcionó para mí. –

1

Puede pausar un hilo llamando al thread.Suspend, pero eso está en desuso. Me gustaría echar un vistazo a autoresetevent para realizar su sincronización.

1

Deberías hacerlo a través de ManualResetEvent.

ManualResetEvent mre = new ManualResetEvent(); 
mre.WaitOne(); // This will wait 

En otro hilo, obviamente, que necesita una referencia al MRE

mre.Set(); // Tells the other thread to go again 

un ejemplo completo que imprimirá un texto, esperar a que otro hilo que hacer algo, y luego retomar:

class Program 
{ 
    private static ManualResetEvent mre = new ManualResetEvent(false); 

    static void Main(string[] args) 
    { 
     Thread t = new Thread(new ThreadStart(SleepAndSet)); 
     t.Start(); 

     Console.WriteLine("Waiting"); 
     mre.WaitOne(); 
     Console.WriteLine("Resuming"); 
    } 

    public static void SleepAndSet() 
    { 
     Thread.Sleep(2000); 
     mre.Set(); 
    } 
} 
Cuestiones relacionadas