C#. Оптимизация PLINQ через Partitioner
хочу сделать проекцию (Select) 100000 элементов параллельно, с сохранением последовательности.
var nums1 = Enumerable.Range(0, 100000).ToArray();
var particioner = Partitioner.Create(nums1, true);
var points= particioner.AsParallel()
.AsOrdered()
.Select(i =>
{
//Задержки для проверки AsOrdered(). сохранение порядка элементов при длительной обработке некоторых элементов.
if (i == 1) Thread.Sleep(100);
if (i == 5) Thread.Sleep(2000);
if (i == 6) Thread.Sleep(3000);
return new Point {X = i};
})
.ToArray();
Чтобы не порождать много новых потоков для быстрой операции проекции к объекту Point, я думаю нужно использовать Partitioner. Самое простое - использовать его в автоматическом режиме, вызвав на нем AsParallel(). Оптимально ли такое решение или лучше использовать ручное разбиение на порции. И потом упорядочить коллекцию?
Parallel.ForEach(Partitioner.Create(0, nums1.Length), range => {
for (var i = range.Item1; i < range.Item2; i++) {
var elem= nums1[i]
points[i] = new Point {X = elem};
}
});
И стоит ли использовать WithDegreeOfParallelism() для тонкой настройки?