pregunté a preguntas similares y recibió un montón de buenas respuestas: Shutting down a multithreaded application
Nota: mi pregunta no requería una salida elegante, pero la gente todavía me recomendó que con gracia salida del bucle de cada hilo.
Lo principal a recordar es que si se quiere evitar que sus hilos impiden que el proceso de terminación se debe configurar todos los hilos a fondo:
Thread thread = new Thread(new ThreadStart(testObject.RunLoop));
thread.IsBackground = true;
thread.start();
La mejor forma de iniciar y administrar hilos es en a ThreadPool
, pero casi cualquier contenedor puede usarse para mantener una referencia a sus hilos. Sus hilos siempre deben tener una bandera que les diga que terminen y deben revisarlo continuamente.
Además, para un mejor control puede suministrar sus hilos con un CountdownLatch
: cada vez que un hilo sale de su ciclo, se emitirá una señal en un CountdownLatch
. Su hilo principal llamará al método CountdownLatch.Wait()
y se bloqueará hasta que todos los hilos se hayan señalizado ... esto le permite una limpieza adecuada y asegura que todos sus hilos se hayan apagado antes de comenzar la limpieza.
public class CountdownLatch
{
private int m_remain;
private EventWaitHandle m_event;
public CountdownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
También es digno de mencionar que el método Thread.Abort() hace algunas cosas extrañas:
Cuando llama un hilo Abortar sobre sí misma, el efecto es similar a lanzar una excepción ; la excepción ThreadAbortException ocurre inmediatamente y el resultado es predecible. Sin embargo, si un hilo llama Abort en otro hilo, el aborto interrumpe el código que esté ejecutando . También existe la posibilidad de que un constructor estático se pueda cancelar. En casos excepcionales, esto podría evitar que las instancias de esa clase sean creadas en ese dominio de aplicación. En .NET Framework versiones 1.0 y 1.1, existe la posibilidad de que el hilo pueda abortar mientras se ejecuta finalmente un bloque , en cuyo caso el bloque finalmente se cancela.
El subproceso que llama Abort podría bloque si el hilo que está siendo abortado está en una región protegida de código, tal como un bloque de captura, finalmente bloque, o constreñido región ejecución . Si el hilo que llama Abort contiene un bloqueo que requiere el hilo abortado , puede producirse un interbloqueo.
Tengo una pregunta, en el Void ThreadEntry(), una vez que creamos un múltiplo de hilos en la aplicación principal del punto de inicio de la secuencia, podemos iniciar cualquier otra aplicación en ese hilo de acuerdo con el número de subprocesos u asignados. – shawn