РЕДАКТИРОВАТЬ: Относительно обновления на ваш вопрос. Я не заметил, что задача связана с вводом-выводом - и, вероятно, все файлы с одного (традиционного?) Диска. Да, это будет происходить медленнее - потому что вы вводите конфликт в непараллелизируемый ресурс, заставляя диск искать везде.
Задачи, связанные с вводом-выводом, по-прежнему могут эффективно распараллеливаться иногда - но это зависит от того, является ли сам ресурс распараллеливаемым. Например, SSD (с гораздо меньшим временем поиска) может полностью изменить характеристики, которые вы видите - или, если вы выбираете по сети с нескольких индивидуально медленных серверов, вы можете быть IO- привязан, но не на одном канале.
Вы создали запрос, но никогда не использовали его. Самый простой способ заставить все, что будет использоваться с запросом, это использовать Count()
или ToList()
, или что-то подобное. Однако лучше подход будет использовать Parallel.ForEach
:
var options = new ParallelOptions { MaxDegreeOfParallelism = sfcoll.Count() };
Parallel.ForEach(sfcoll, options, sf => ProcessShellObject(sf, curExeName));
Я не уверен, что установка максимальной степени параллелизма - это правильный подход. Это может работать, но я не уверен. Другой подход к этому - запускать все операции как задачи, указав TaskCreationOptions.LongRunning
.