Ответы:
Ничего особенного делать не надо, Parallel.Foreach()
подождем, пока будут выполнены все его разветвленные задачи. Из вызывающего потока вы можете рассматривать его как один синхронный оператор и, например, заключить его в команду try / catch.
Вам это не нужно с Parallel.Foreach: он выполняет foreach только в том количестве потоков, сколько есть доступных процессоров, но возвращает синхронно.
Более подробную информацию можно найти здесь