Ваш текущий код может пойти не так, если удерживается комбинация из двух следующих элементов:
- файлов очень много
- обработка файла (DoStuff) занимает значительное количествоtime
Пул потоков обладает недостаточными возможностями балансировки нагрузки и будет продолжать создавать все больше потоков, выходящих за пределы оптимального числа.
Если вы можете использовать Fx4, используйте TPL.
Для более ранних версий переписать свой код, чтобы использовать меньшее количество потоков.
Правка, поскольку вы используете Fx4:
Наибольший выигрыш может быть при использовании System.Directory.EnumFiles()
вместо Directory.GetFiles()
.
Эскиз:
var files = System.Directory.EnumerateFiles(...); // deferred execution
Parallel.ForEach(files, f => DoStuff(f)); // maybe use MaxDegree or CancelationToken
// all files done here
Вы также можете обернуть это .ForEach в (одиночной) попытке / захвате и т. Д.
И если DoStuff()
требуется параллелизм, вы должны использоватьTPL также, возможно, передавая CancellationToken и т. д. Это поставило бы весь параллелизм под контроль одного планировщика.
Возможно, вам придется помочь в тонкой настройке, но это тоже будет намного проще, чем без TPL.