¿Cómo saber si todos los subprocesos del grupo de subprocesos ya se realizaron con sus tareas?

Tengo esta aplicación que repetirá todas las carpetas en un directorio determinado y buscará PDF. Si se encuentra un archivo PDF, la aplicación contará sus páginas usando ITextSharp. Hice esto usando un hilo para escanear recursivamente todas las carpetas en busca de pdf, luego, si se encuentra el PDF, se pondrá en cola en el grupo de hilos. El código se ve así:

//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 el hilo del grupo de subprocesos ha terminado de procesar todos los elementos en cola para que pueda decirle al usuario que la aplicación ha terminado con la tarea prevista?

Respuestas a la pregunta(2)

Su respuesta a la pregunta