Содержание
По умолчанию, PLINQ не сохраняет исходный порядок элементов последовательности, так как на упорядочивание элементов может потребоваться достаточно много ресурсов, а, как мы уже знаем, PLINQ предназначена, в первую очередь, для повышения производительности. Однако, иногда, при обработке последовательности элементов нам необходимо сохранить порядок элементов. В PLINQ имеются необходимые инструменты для сохранения порядка.
Методы AsOrdered и AsUnordered
Чтобы переопределить поведение PLINQ по умолчанию, можно вызвать метод AsOrdered
для обрабатываемой последовательности, например, следующим образом:
static void Main(string[] args) { IEnumerable<int> range = Enumerable.Range(0, 360); var sin = range.AsParallel() .AsOrdered() //принудительно сохраняем порядок .Select(s => (Angle: s, Sin: Math.Sin(s * Math.PI / 180))); foreach (var i in sin) { Console.WriteLine($"Синус угла {i.Angle} равен {i.Sin}"); } }
В этом случае, в итоговой последовательности сохраниться порядок элементов и в консоли мы увидим следующий вывод:
Синус угла 1 равен 0,01745240643728351
Синус угла 2 равен 0,03489949670250097
Синус угла 3 равен 0,05233595624294383
Синус угла 4 равен 0,0697564737441253
Синус угла 5 равен 0,08715574274765817
Если же у нас выполняется цепочка операций и сохранение порядка элементов нас интересует только на одном из этапов обработки, то отключить сохранение последовательности мы можем, используя метод AsUnordered
.
В любом случае, применяем ли мы сохранение порядка последовательности или, наоборот, отключаем сохранение порядка принудительно, PLINQ, при сохранении прочих настроек по умолчанию, всё также будет самостоятельно выбирать режим работы — последовательно или параллельно, в зависимости от того, какой из вариантов будет наиболее выгоден в конкретной ситуации.
Итого
PLINQ позволяет, при необходимости, сохранять порядок элементов последовательности, используя метод AsOrdered. При этом, PLINQ самостоятельно определяет режим обработки данных — параллельно или последовательно, если пользователь явно не укажет режим обработки. Как принудительно заставить PLINQ работать в параллельном режиме — узнаем далее.