for (int i=0; i < data.Length; i++) data[i] = i;
// Поместить отрицательное значение в массив data, data[100000] = -10;
// Использовать цикл, параллельно выполняемый методом ForEachO,
// для отображения данных на экране.
ParallelLoopResult loopResult = Parallel.ForEach(data, DisplayData);
// Проверить, завершился ли цикл, if(!loopResult.IsCompleted)
Console.WriteLine("ХпЦикл завершился преждевременно из-за того, " +
"что обнаружено отрицательное значение\п" +
"на шаге цикла номер " +
loopResult.LowestBreaklteration + ".\n");
Console.WriteLine("Основной поток завершен.");
}
}
В приведенной выше программе именованный метод применяется в качестве делегата, представляющего "тело" цикла. Но иногда удобнее применять анонимный метод. В качестве примера ниже приведено реализуемое в виде лямбда-выражения "тело" цикла, параллельно выполняемого методомForEach .
// Использовать цикл, параллельно выполняемый методом ForEachO,
// для отображения данных на экране.
ParallelLoopResult loopResult =
Parallel.ForEach(data, (v, pis) => {
Console.WriteLine("Значение: " + v); if (v < 0) pis.Break ;
});
Исследование возможностей PLINQ
PLINQ представляет собой параллельный вариант языка интегрированных запросов LINQ и тесно связан с библиотекой TPL. PLINQ применяется, главным образом, для достижения параллелизма данных внутри запроса. Как станет ясно из дальнейшего, сделать это совсем не трудно. Как и TPL, тема PLINQ довольно обширна и многогранна, поэтому в этой главе представлены лишь самые основные понятия данного языка.
Класс ParallelEnumerable
Основу PLINQ составляет классParallelEnumerable,определенный в пространстве именSystem. Linq.Это статический класс, в котором определены многие методы расширения, поддерживающие параллельное выполнение операций. По существу, он представляет собой параллельный вариант стандартного для LINQ классаEnumerable.Многие его методы являются расширением классаParallelQuery,а некоторые из них возвращают объект типаParallelQuery.В классеParallelQueryинкапсулируется последовательность операций, поддерживающая параллельное выполнение. Имеются как обобщенный, так и необобщенный варианты данного класса. Мы не будем обращаться к классуParallelQueryнепосредственно, а воспользуемся несколькими методами классаParallelEnumerable.Самый главный из них, методAs Parallel , описывается в следующем разделе.
Распараллеливание запроса методом AsParallel