Mi colega está utilizando una biblioteca .NET de terceros para la que no tenemos el código fuente. Estamos usando un ThreadPool para que un montón de hilos llame a esta biblioteca, y de vez en cuando uno de los hilos quedará colgado para siempre mientras el resto de ellos avanza alegremente.Subproceso de llamada.Abordear un subproceso de un ThreadPool
Por lo tanto, queremos utilizar el temido Thread.Abort
para eliminar dichos hilos. Ya he hecho esto antes al girar mis propios hilos, pero nunca he usado un ThreadPool. Si hacemos un seguimiento de las horas de inicio de cada tarea como esta:
static Dictionary<Thread, DateTime> started = new Dictionary<Thread, DateTime>();
static void DoSomeWork(object foo)
{
lock(started)
started[Thread.CurrentThread] = DateTime.Now;
SomeBuggyLibraryThatMightInfiniteLoopOrSomething.callSomeFunction(doo);
lock(started)
started.Remove(Thread.CurrentThread);
}
entonces podremos bloquear y iterar sobre los subprocesos que se ejecutan y llame Thread.Abort
matarlos? Y si lo hacemos, ¿tendremos que agregar un hilo nuevo al ThreadPool para reemplazar el que acabamos de matar, o lo manejará el ThreadPool por nosotros?
EDIT: Estoy muy consciente de todos los problemas potenciales con Thread.Abort
. Sé que lo ideal es que nunca se use en el código de producción, y que ni siquiera detiene necesariamente el hilo, y que si abortas un hilo mientras el hilo ha adquirido un bloqueo, puedes colgar otros hilos, etc. Pero ahora tenemos un plazo ajustado y tenemos razones de peso para creer que en este caso en particular, podemos llamar al Thread.Abort
sin poner todo el proceso en peligro, y nos gustaría evitar volver a escribir este programa para eliminar el ThreadPool. a menos que tengamos que hacerlo absolutamente.
Entonces, lo que quiero saber es esto: dado que llamaremos al Thread.Abort
en un hilo que pertenece a un ThreadPool, ¿hay algún problema especial causado por estos hilos de ThreadPool, y tenemos que hacer girar manualmente un nuevo hilo para reemplazar el que se mató o lo hará el ThreadPool por nosotros?
"[Abortar un hilo ThreadPool] es peligrosa, sin embargo. En el momento en que se reciba la notificación y el hilo se interrumpe, el elemento de trabajo original, ya podría haber terminado, de modo que de la piscina el hilo ya se movió a otro elemento de trabajo . Se estaría abortando ese elemento de trabajo secundario en lugar del deseado, abriendo usted mismo a un mundo de dolor. "- Stephen Toub, MSDN Magazine 06-03 – JBSnorro