Насколько я понимаю, PLINQ выберет разбиение на диапазоны или порции в зависимости от того, является ли исходная последовательность IList
или нет.Если это IList
, границы известны, и элементы могут быть доступны по индексу, поэтому PLINQ выбирает разбиение по диапазонам для равномерного разделения списка между потоками.Например, если в вашем списке 1000 элементов и вы используете 4 потока, каждый поток будет обрабатывать 250 элементов.С другой стороны, если исходной последовательностью является , а не и IList
, PLINQ не может использовать разбиение диапазонов, поскольку не знает, какими будут диапазоны;поэтому вместо него используется разбиение на куски.
В вашем случае, если у вас есть IList
, и вы хотите принудительно создать разбиение на куски, вы можете просто сделать его похожим на простое IEnumerable
: вместо записи этого
list.AsParallel()...
Напишите, что:
list.Select(x => x).AsParallel()...
Фиктивная проекция скрывает тот факт, что источник на самом деле IList
, поэтому PLINQ будет использовать разбиение на фрагменты.