Едва ли не самым удобным средством PLINQ является возможность просто создавать параллельный запрос. Нужно лишь вызвать методAsParallel для источника данных. МетодAsParallel определен в классеParallelEnumerableи возвращает источник данных, инкапсулированный в экземпляре объекта типаParallelQuery.Это дает возможность поддерживать методы расширения параллельных запросов. После вызова данного метода запрос разделяет источник данных на части и оперирует с каждой из них таким образом, чтобы извлечь максимальную выгоду из распараллеливания. (Если распараллеливание оказывается невозможным или неприемлемым, то запрос, как обычно, выполняется последовательно.) Таким образом, добавления в исходный код единственного вызова методаAsParallel оказывается достаточно для того, чтобы превратить последовательный запрос LINQ в параллельный запрос LINQ. Для простых запросов это единственное необходимое условие.
Существуют как обобщенные, так и необобщенные формы методаAsParallel .Ниже приведена простейшая обобщенная его форма:
public static ParallelQuery AsParallel(this IEnumerable
AsParallel
гдеTSourceобозначает тип элементов в последовательном источнике данных
Ниже приведен пример, демонстрирующий простой запрос PLINQ.
// Простой запрос PLINQ.
using System; using System.Linq;
class PLINQDemo {
static void Main {
int[] data = new int[10000000];
// Инициализировать массив данных положительными значениями, for(int i=0; i < data.Length; i++) data[i] = i;
//А теперь ввести в массив данных ряд отрицательных значений
data[1000] = -1;
data[14000] = -2;
data[15000] = -3;
data[676000] = -4;
data[8024540] = -5; data[9908000] = -6;
// Использовать запрос PLINQ для поиска отрицательных значений, var negatives = from val in data.AsParallel where val < 0 select val;
foreach(var v in negatives)
Console.Write(v + " ");
Console.WriteLine;
}
}
Эта программа начинается с создания крупного массиваdata,инициализируемого целыми положительными значениями. Затем в него вводится ряд отрицательных значений. А далее формируется запрос на возврат последовательности отрицательных значений. Ниже приведен этот запрос.
var negatives = from val in data.AsParallel where val < 0 select val;