В этом запросе методAsParallel вызывается для источника данных, в качестве которого служит массивdata.Благодаря этому разрешается параллельное выполнение операций над массивомdata,а именно: поиск отрицательных значений параллельно в нескольких потоках. По мере обнаружения отрицательных значений они добавляются в последовательность вывода. Это означает, что порядок формирования последовательности вывода может и не отражать порядок расположения отрицательных значений в массивеdata.В качестве примера ниже приведен результат выполнения приведенного выше кода в двухъядерной системе.
-5 -6 -1 -2 -3 -4
Как видите, в том потоке, где поиск выполнялся в верхней части массива, отрицательные значения -5 и -6 были обнаружены раньше, чем значение -1 в том потоке, где поиск происходил в нижней части массива. Следует, однако, иметь в виду, что из-за отличий в степени загрузки задачами, количества доступных процессоров и прочих факторов системного характера могут быть получены разные результаты. А самое главное, что результирующая последовательность совсем не обязательно будет отражать порядок формирования исходной последовательности.
Применение метода AsOrdered
Как отмечалось в предыдущем разделе, по умолчанию порядок формирования результирующей последовательности в параллельном запросе совсем не обязательно должен отражать порядок формирования исходной последовательности. Более того, результирующую последовательность следует рассматривать как практически неупорядоченную. Если же результат должен отражать порядок организации источника данных, то его нужно запросить специально с помощью методаAsOrdered , определенного в классеParallelEnumerable.Ниже приведены обобщенная и необобщенная формы этого метода:
public static ParallelQuery AsOrdered(this ParallelQuery
AsOrdered
гдеTSourceобозначает тип элементов в источнике данных
Для того чтобы посмотреть, к какому результату может привести применение методаAsOrdered , подставьте его вызов в приведенный ниже запрос из предыдущего примера программы.
// Использовать метод AsOrdered для сохранения порядка // в результирующей последовательности.
var negatives = from val in data.AsParallel.AsOrdered where val < 0 select val;