Обработка месяца дат параллельно с индикатором выполнения - PullRequest
2 голосов
/ 06 марта 2012

Я работаю над проектом ASP.Net MVC 3 C #.

Я читал о ThreadPool.QueueUserWorkItem и задачах, я думаю, что мне нужно использовать один из них.

public static void ProcessDay(DateTime day) { ... }

Допустим, я хочу обрабатывать дни с 2012-01-01 по 2012-01-31, поэтому мне нужно вызывать функцию ProcessDay 31 раз.

Как обрабатывать 5 дней одновременно и сохранятьзапускать больше потоков, как любой из 5 потоков, до тех пор, пока не закончится 31 день?

Сэмплы высоко ценятся, и хорошая идея показывать индикатор выполнения:)

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Взгляните на библиотеку TPL - например,

DateTime startDate = new DateTime(2012, 01, 01);
var options = new ParallelOptions() { MaxDegreeOfParallelism = 5 };
Parallel.For(0, 30, options, day => { ProcessDay(startDay.AddDays(day)); });
1 голос
/ 06 марта 2012

Простое распараллеливание этого может быть: -

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, так что это также может быть вариантом, если вы хотите исследовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...