Tengo esta aplicación que recurrirá todas las carpetas en un directorio determinado y buscará PDF. Si se encuentra un archivo PDF, la aplicación contará sus páginas con ITextSharp. Hice esto mediante el uso de un hilo para escanear recursivamente todas las carpetas para PDF, y luego, si se encuentra PDF, esto se pondrá en cola para el grupo de subprocesos. El código es el siguiente:¿Cómo saber si todo el hilo del conjunto de hilos ya está hecho con sus tareas?
//spawn a thread to handle the processing of pdf on each folder.
var th = new Thread(() =>
{
pdfDirectories = Directory.GetDirectories(pdfPath);
processDir(pdfDirectories);
});
th.Start();
private void processDir(string[] dirs)
{
foreach (var dir in dirs)
{
pdfFiles = Directory.GetFiles(dir, "*.pdf");
processFiles(pdfFiles);
string[] newdir = Directory.GetDirectories(dir);
processDir(newdir);
}
}
private void processFiles(string[] files)
{
foreach (var pdf in files)
{
ThreadPoolHelper.QueueUserWorkItem(
new { path = pdf },
(data) => { processPDF(data.path); }
);
}
}
Mi problema es, ¿cómo sé que ese hilo de la piscina mensaje ha terminado de procesar todos los elementos en cola para que pueda avisar al usuario de que la aplicación se realiza con la tarea prevista?
He hecho una lógica similar a esto. Solo utilicé ThreadPool.GetAvailableThreads. Configuré MaxThreads que las agrupaciones deberían estar usando por 20. Así que, al final de la tarea, verifiqué si los hilos disponibles son iguales al máximo que establecí. Desafortunadamente esto falla. Investigaré sobre ese evento de reinicio manual. –
@mcxiand: No puede usar los contadores ThreadPool porque otro código (lib) podría crear subprocesos y el TP los está reciclando/eliminando. –
@Henk Holterman: ¿Es así? Por lo que entendí es que, ThreadPool se pondrá en cola de la tarea mediante el método QueueUserWorkItem. ¿Puedes dar más detalles sobre tu comentario? sería muy apreciado. –