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() для тонкой настройки?


Ответы (0 шт):