Действительно Параллелен. ForEach требуют AsParallel ()

ParallelEnumerable имеет статического участника AsParallel. Если я имею IEnumerable<T> и хочу использовать Parallel.ForEach делает, которые подразумевают, что я должен всегда использовать AsParallel?

например, оба из них корректны (все остальное являющееся равным)?

без AsParallel:

List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));

или с AsParallel?

List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
18
задан tzaman 9 June 2010 в 14:08
поделиться

1 ответ

Это зависит от того, что вызывается, это отдельные вопросы.

.AsParallel () Распараллеливает перечисление , а не делегирование задач.

Parallel.ForEach Распараллелил цикл , назначив задачи рабочим потокам для каждого элемента.

Таким образом, если ваше перечисление источников не выигрывает от параллелизма (например, reader.Match (file) стоит дорого), они равны. На ваш последний вопрос, да , оба они также верны.

Кроме того, есть еще одна конструкция, которую вы можете захотеть рассмотреть, которая немного сокращает ее, по-прежнему получая максимальную пользу от PLINQ:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));
23
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: