1.
Мой вопрос: будет ли это когда-нибудь?
возможно закончить нить,
уменьшите numFilesLeft и найдите его
равно 0, потому что следующий элемент
не был добавлен в качестве рабочего элемента и
не потому что все файлы были
обрабатываются?
Да. Потому что мы точно не знаем, когда поток начнет обрабатывать.
2
Если это возможно, что будет
стандартный способ убедиться, что это не так
произойти?
Вместо этого мы можем использовать массив ManualResetEvent, тогда в главном потоке мы будем ждать завершения всех потоков.
// Предположим, что вы получили количество файлов в каталоге.
var fileCount = 10;
ManualResetEvent[] waitHandles = new ManualResetEvent[fileCount];
Перечислять файлы и создавать каждый поток, как вы сделали. Кроме того, передайте каждый ManualResetEvent как состояние потока каждому потоку, который вы инициализируете.
......
ThreadPool.QueueWorkItem(ProcessFile, waitHandles[i]);
.....
Внутри метода ProcessFile () восстанавливается ManualResetEvent.
void ProcessFile(object stateInfo)
{
var waitHandle = stateInfo as ManualResetEvent;
//Do your work here
//finished. Call Reset()
waitHandle.Reset()
}
В основной ветке мы ждем всех.
WaitHandle.WaitAll(waitHandles);
Это гарантирует, что все файлы будут обработаны до завершения основного потока.
Надеюсь, что поможет.