Я пишу программу, которая должна рекурсивно искать в структуре папок и хотела бы делать это параллельно с несколькими потоками.
Я уже написал довольно тривиальный синхронный метод — первоначальное добавление корневого каталога в очередь, затем удаление каталога из очереди, добавление в очередь его подкаталогов и т. д., пока очередь не станет пустой. Я буду использовать ConcurrentQueue<T>
для своей очереди, но уже понял, что мои петли остановятся преждевременно. Первый поток исключит корневой каталог из очереди, и сразу же все остальные потоки увидят, что очередь пуста, и выйдут, оставив первый поток единственным работающим. Я хотел бы, чтобы каждый поток зацикливался до тех пор, пока очередь не станет пустой, затем подождите, пока другой поток не поставит в очередь еще несколько каталогов, и продолжайте работу. Мне нужна какая-то контрольная точка в моем цикле, чтобы ни один из потоков не вышел, пока каждый поток не достигнет конца цикла, но я не уверен, что это лучший способ сделать это без взаимоблокировки, когда действительно больше нет каталогов для процесс.
Directory.EnumerateFiles()
. А если нужен параллелизм, TPL и BlockingCollection. - person Henk Holterman   schedule 08.05.2011