Простое распараллеливание этого может быть: -
var dates = Enumerable.Range(1, DateTime.DaysInMonth(year, month)).Select(day => new DateTime(year, month, day));
Parallel.ForEach(dates, date => { ... });
(Обратите внимание, что если у вас есть общее состояние, которое необходимо изменить каждому потоку, вам придется соответствующим образом использовать методы синхронизации потоков.)
Что касается количества потоков, обычно лучше оставить Parallel.ForEach()
, чтобы решить это для себя. Он будет использовать внутренний пул потоков и будет эффективно использовать все доступные процессоры. Вы можете ограничить число потоков, которые он будет использовать, используя перегрузку ForEach
, которая принимает объект ParallelOptions
с MaxDegreeOfParallelism
, установленным на требуемое количество, но вы должны запустить некоторые тесты, чтобы увидеть, действительно ли вы можете добиться лучших результатов. делая это.
Более того, если это «долгосрочное задание», для которого вы хотите показать прогресс, вы не сможете достичь этого с помощью одного веб-запроса. Понятие «индикатор выполнения» на веб-сайте несколько отличается от понятия в настольном приложении. На веб-сайте это обычно делается опросом. То есть отправить запрос, который запускает процесс (ответ возвращается немедленно), периодически запрашивать прогресс (который может отображаться в индикаторе выполнения или аналогичный), а затем отображать результат по окончании.
Существуют также рамки и методы, разрабатываемые для уведомления типа «push», например, SignalR, так что это также может быть вариантом, если вы хотите исследовать его.