Respuestas:
No tiene que hacer nada especial, Parallel.Foreach()
esperará hasta que se completen todas sus tareas ramificadas. Desde el hilo de llamada puede tratarlo como una sola declaración síncrona y, por ejemplo, envolverlo dentro de un try / catch.
No necesita eso con Parallel.Foreach: solo ejecuta foreach en tantos subprocesos como procesadores disponibles, pero vuelve sincrónicamente.
Más información se puede encontrar aquí