2012-05-19 244 views
13

¿Alguien puede darme una ventaja sobre el tema de enhebrar? Creo que sé cómo hacer algunas cosas, pero necesito saber cómo hacer lo siguiente:C# Threading - Cómo iniciar y detener un hilo

Configurar un hilo principal que permanecerá activo hasta que lo señalice para detenerlo (en caso de que se pregunte, terminará cuando los datos Esta recibido). Luego quiero iniciar un segundo hilo que capture los datos de un cuadro de texto y debería salir cuando lo señalo para que ocurra cuando el usuario presiona la tecla Intro.

¡Salud!

+0

sólo tiene que utilizar un bucle, mientras que en el otro hilo hasta que recibe los datos –

+0

partir de un hilo es muy fácil. Parar uno es increíblemente difícil. Centrarse en la parada. –

+1

Podría considerar usar un BackgroundWorker. Tiene devoluciones de llamadas de eventos seguros para subprocesos que son bastante útiles si necesita manipular componentes de formulario/control. – climbage

Respuesta

16

Esto es cómo lo hago ...

public class ThreadA { 
    public ThreadA(object[] args) { 
     ... 
    } 
    public void Run() { 
     while (true) { 
      Thread.sleep(1000); // wait 1 second for something to happen. 
      doStuff(); 
      if(conditionToExitReceived) // what im waiting for... 
       break; 
     } 
     //perform cleanup if there is any... 
    } 
} 

A continuación, para ejecutar esta en su propio hilo ... (lo hago de esta manera porque yo también quiero enviar args al hilo)

private void FireThread(){ 
    Thread thread = new Thread(new ThreadStart(this.startThread)); 
    thread.start(); 
} 
private void (startThread){ 
    new ThreadA(args).Run(); 
} 

El hilo se crea llamando "FireThread()"

El hilo recién creado se ejecutará hasta que su condición de s la parte superior se cumple, entonces se muere ...

Puede señalar el "principal" con los delegados, a decir que cuando el mensaje ha muerto .. así que usted puede entonces comenzar la segunda ...

Mejor para leer: This MSDN Article

+0

Tenga en cuenta que este enfoque crea la oportunidad de hasta un segundo de retraso entre las cosas que se muestran y las que realmente se hacen. No necesariamente malo, depende de tus requisitos. Actualmente estoy buscando la mejor manera de utilizar un subproceso de trabajo en segundo plano utilizando un EventWaitHandle para cross-process/thread signaling, pero luego tengo la buena suerte de tener control sobre ambos procesos (el generador de cosas y las cosas). Esto debería eliminar cualquier retraso de votación. –

5
Thread th = new Thread(function1); 
th.Start(); 
th.Abort(); 

void function1(){ 
//code here 
} 
+12

Creo que 'Abort() 'debería ser una llamada de último recurso. Sería mejor establecer una bandera y hacer que el hilo se detenga con gracia. – climbage

+9

-1: Lo siento, pero 'Thread.Abort' es casi _nunca_ la forma de hacerlo. Un bucle con un 'ManualResetEvent' - o incluso una bandera booleana volátil - sería un enfoque más seguro. – Douglas

4

Usa un AutoResetEvent estático en tus subprocesos engendrados para volver a llamar al hilo principal usando el método Set(). Este tipo tiene una demo bastante buena en SO sobre cómo usarla.

AutoResetEvent clarification