2010-08-22 26 views
11

Tengo un singleton que tiene un hilo en ejecución para obtener registros de un servidor. Pero cuando detengo mi aplicación de winform, el hilo sigue en ejecución. He intentado crear un destructor en mi singleton para abortar el hilo si se está ejecutando, pero no tiene ningún efecto en el hilo; sé que el destructor está siendo evocado.Cómo detener un hilo cuando se cierra mi aplicación winform

Estoy buscando sugerencias sobre cómo debo cerrar un hilo cuando se cierra mi aplicación. gracias

C#, .NET2

+0

posible duplicado de [? Cómo detener BackgroundWorker en caso de cierre de la Forma] (http://stackoverflow.com/questions/1731384/how-to-stop- backgroundworker-on-forms-closing-event) –

+0

Miré su sugestión de enlace ... no hizo nada por mí – fishhead

Respuesta

9

la mejor opción, si es posible en su aplicación, es la cancelación de cooperación.

Un hilo se detiene automáticamente cuando no tiene más código para ejecutar. Entonces, cuando el usuario cierra su aplicación, establece un indicador que indica que su hilo debe detenerse. El hilo debe verificarse de vez en cuando si se establece el indicador y, si es así, deje de obtener registros del servidor y vuelva.

De lo contrario, se puede rodar su propia solución, por ejemplo

static bool isCancellationRequested = false; 
static object gate = new object(); 

// request cancellation 
lock (gate) 
{ 
    isCancellationRequested = true; 
} 

// thread 
for (int i = 0; i < 100000; i++) 
{ 
    // simulating work 
    Thread.SpinWait(5000000); 

    lock (gate) 
    { 
     if (isCancellationRequested) 
     { 
      // perform cleanup if necessary 
      //... 
      // terminate the operation 
      break; 
     } 
    } 
} 
54

Un hilo puede ser:

  • primer plano: mantendrá vivas sus programas hasta que esté acabado.
  • Antecedentes: finalizará cuando cierre su aplicación.

Cuando crea un hilo, es por defecto un hilo de primer plano.

Puede cambiar eso así:

Thread t = new Thread(myAction); 
t.IsBackground = true; 
t.Start();
+0

¿Finaliza un hilo de fondo cuando se cierra un formulario? Por ejemplo, supongamos que tengo varios formularios y en un formulario tengo un hilo. Cuando el formulario se cierra, ¿terminará el hilo también, incluso si está en un bucle infinito? ¿O terminará el hilo cuando la aplicación sale (cuando Main finaliza el proceso)? – JT9

+0

@ JT9 Acabo de probarlo, el hilo de fondo no termina cuando se cierra un formulario en una aplicación de varias formas. – tunafish24

Cuestiones relacionadas