При выполнении параллельных запросов в PLINQ также могут возникать различные исключения, которые необходимо каким-либо образом обрабатывать. При выполнении параллельных запросов PLINQ разбивает исходную последовательность на части, каждая из которых обрабатывается в отдельном потоке. При этом, если в каких-либо потоках возникают исключения, то все они собираются в одном объекте исключений типа AggregateException
.
PLINQ
Parallel LINQ (PLINQ) в C#. Параметры слияния в PLINQ (методы WithMergeOptions и ForAll)
При параллельном выполнении запроса PLINQ разделяет исходную последовательность на несколько частей, каждая из которых обрабатывается в отдельном потоке. Когда нам необходимо использовать результаты вычислений в главном потоке приложения, например в цикле foreach
, то полученные в каждом потоке результаты объединяются снова в одну последовательность. PLINQ может выполнять разные типы слияния в зависимости от операторов, которые присутствуют в запросе. Для потока ожидающего такой результат может пройти достаточно большой период времени, пока появятся первые результаты полностью буферизованного запроса. Однако, используя различные варианты слияния в PLINQ, в некоторых случаях, мы можем ускорить работу приложения и повысить его производительность.
Parallel LINQ (PLINQ) в C#. Режим выполнения запроса (метод WithExecutionMode)
Не все запросы могут стать автоматически быстрее при параллельном выполнении. Например, если запрос содержит только один пользовательский делегат с небольшим числом задач, то такой запрос последовательно выполняется быстрее. Это связано с различными дополнительными накладными расходами на управление параллельным выполнением. Однако, PLINQ позволяет, при необходимости, указать тот режим выполнения запроса, который вам необходим. Для этого используется один из методов расширения PLINQ — WithExecutionMode
.
Parallel LINQ (PLINQ) в C#. Сохранение порядка (методы AsOrdered и AsUnordered)
По умолчанию, PLINQ не сохраняет исходный порядок элементов последовательности, так как на упорядочивание элементов может потребоваться достаточно много ресурсов, а, как мы уже знаем, PLINQ предназначена, в первую очередь, для повышения производительности. Однако, иногда, при обработке последовательности элементов нам необходимо сохранить порядок элементов. В PLINQ имеются необходимые инструменты для сохранения порядка.
Parallel LINQ (PLINQ) в C#. Метод AsParallel
Начиная с .NET 4.0, в пространство имен System.Linq
был добавлен класс ParallelEnumerable
, позволяющий выполнять запросы к источнику данных в параллельном режиме. При обработке запроса, по умолчанию, LINQ обрабатывает все элементы коллекции последовательно, однако, PLINQ позволяет разбить исходную последовательность элементов на сегменты и обработать каждый сегмент параллельно, используя возможности всех процессоров в системе. Для того, чтобы воспользоваться возможностями PLINQ необходимо явно указать платформе, что мы хотим обработать запрос в параллельном режиме. Для этого мы должны использовать метод AsParallel()
.