Как объяснили другие, хранение такого количества строк израсходует много памяти и не сможет масштабироваться. Попытка перечислить папки и файлы в параллельно также не ускорит обработку.
Быстрее использовать Directory.EnumerateFiles или даже лучше, DirectoryInfo.EnumerateFiles с SearchOption.AllDirectories
для перечисления всех файлов в текущей папке и подпапках и обрабатывать файлы параллельно.
Быстрый и грязный вариант - использовать запрос LINQ для фильтрации всех целевых файлов и Parallel.ForEach для обработки файлов, например:
var extensions=new[]{".docx", ".xlsx",...};
var folder=new DirectoryInfo(targetDirectory);
var files=from file in folder.EnumerateFiles("*.*", SearchOption.AllDirectories)
where extensions.Contains(file.Extension,StringComparer.InvariantCultureIgnoreCase)
select file;
Parallel.ForEach(files,file=>ProcessFile(file));
Для обработки файлов будет использоваться примерно столько же задач, сколько ядер машины. Вы можете использовать больше задач, указав другую опцию MaxDegreeOfParallelism:
var options=new ParallelOptions { MaxDegreeOfParallelism = 4 }
Parallel.ForEach(files,options,ProcessFile);
Parallel.ForEach
будет извлекать имена файлов из запроса files
по мере необходимости. Он начнет обработку, как только EnumerateFiles
вернет первые результаты, вместо того, чтобы ожидать загрузки всех имен файлов и их кэширования в памяти.