2010-03-12 5 views
5

¿Cuál es la mejor manera de terminar una aplicación multihilo de forma limpia?
Estoy comenzando varias conexiones de socket desde la hebra principal en sockets separados y espero hasta el final de mi día laboral en la hebra principal y uso actualmente System.Environment.Exit(0) para terminarla.Multi-Threading - Estrategia de limpieza al final del programa

Esto conduce a una excepción no controlada en uno de los hijos. ¿Debería detener los hilos de la lista? He sido reacio a implementar cualquier parada real en los niños, por lo tanto, me pregunto acerca de la mejor práctica. Todos los conectores están bien conectados con los destructores adecuados para cerrar y cerrar sesión, pero todavía conduce a errores.

Respuesta

2

Para roscas manualy creados se debe configurar IsBackground propiedad a verdad En este caso (si todos sus hilos, excepto el principal) serían de fondo, su aplicación se cerrará correctamente después de regresar de la función Principal (cadena [] arg).

P.S. Todos los hilos de Thread pools son de fondo.

+5

Hacer que todos los subprocesos de sus hilos de trabajo puedan evitar los gritos de muerte a medida que el proceso finaliza, pero no es muy elegante. Los hilos de fondo se terminan, incluso si están en el medio de hacer algo, una vez que todos los hilos de primer plano han terminado. – OldFart

+0

Lo he implementado y lo probaré el lunes. – weismat

+0

Probado y trabajado como un encanto. – weismat

0

Siempre que haga una espera larga bloqueada (como esperar una conexión entrante) use la forma Begin/End del método. A continuación, utilice un ManualResetEvent para representar la condición 'should exit'. Luego bloquea en AsyncWaitHandle y el evento de salida. Esto te permitirá finalizar de forma limpia.

Ejemplo:

// exit is a ManualResetEvent 
var asyncResult = socket.BeginAccept(null, null); 
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0) 
    return; 
var connection = socket.EndAccept(asyncResult); 

Y en su principal método cuando se quiere dejar de fumar:

exit.Set(); 
Cuestiones relacionadas