Bueno, la respuesta OO sería mantener una lista de hilos como un campo.
private readonly List<Thread> threads = new List<Thread>();
Y para luego agregar el hilo recién construido a la lista en el primer controlador.
var thread = new Thread(myfunc);
thread.Start();
threads.Add(thread);
Luego puede repetir cada hilo en el segundo controlador, abortando cada uno de ellos sucesivamente.
foreach(var thread in threads)
thread.Abort();
pero creo que el punto más importante aquí es que no es casi nunca una buena razón para llamar Thread.Abort
.
Desde el MSDN page:
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 aborta interrumpe el código que se está ejecutando. También existe la posibilidad de que un constructor estático se pueda cancelar. En casos excepcionales, esto podría evitar que 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 se cancela el bloque finally .
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.
que sería mucho mejor usar algún tipo de señalización, tales como el establecimiento de un ManualResetEvent
que cada hilo sondeará a intervalos périodicas. Alternativamente, puede usar la clase BackgroundWorker
que tiene algún soporte para la cancelación de tarea (llame al CancelAsync
y obtenga los hilos de trabajo para probar CancellationPending
periódicamente). Si está en .NET 4.0, también puede usar el TPL.
¿Hay alguna razón por la que no pueda usar BackgroundWorker o una construcción similar? Los hilos de desove implican muchos gastos generales, por lo que tiene sentido reutilizarlos siempre que sea posible. –