Вопрос

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));
Это было полезно?

Решение

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

.AsParallel() Параллельно перечисление Не делегирование задач.

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

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

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

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top