Предполагая, что doStuff
является поточно-ориентированным, и что вам не нужно ждать завершения всего сканирования, вы можете вызвать как doStuff
, так и scan
в ThreadPool, например:
string path = file;
ThreadPool.QueueUserWorkItem(delegate { doStuff(path); });
Вам нужно создать отдельную локальную переменную, потому что анонимный метод должен был бы перехватить саму переменную file
и видеть изменения в ней на протяжении всего цикла. (Другими словами, если ThreadPool выполнил задачу только после того, как цикл продолжился до следующего файла, он обработал бы неправильный файл)
Однако, читая ваш комментарий, основной проблемой здесь является дисковый ввод-вывод, поэтому я подозреваю, что многопоточность мало чем поможет.
Обратите внимание, что Directory.GetFiles
будет работать медленно для каталогов с большим количеством файлов. (Так как ему нужно выделить массив для хранения имен файлов)
Если вы используете .Net 4.0, вы можете сделать это быстрее, вызвав вместо этого EnumerateFiles
метод , который использует итератор для возврата IEnumerable<string>
, который перечисляет каталог при запуске цикла.
Вы также можете избежать рекурсивных вызовов scan
с помощью любого метода, передав параметр SearchOption
, например:
foreach (string file in Directory.EnumerateFiles(rootDirectory, "*", SearchOption.AllDirectories))
Это будет рекурсивно сканировать все подкаталоги, поэтому вам понадобится всего один цикл foreach
.
Обратите внимание, что это усугубит проблемы с производительностью GetFiles
, поэтому вы можете избежать этой предварительной версии 4.0.