Едва ли не самым удобным средством PLINQ является возможность просто создавать параллельный запрос. Нужно лишь вызвать методAsParallel() для источника данных. МетодAsParallel() определен в классеParallelEnumerableи возвращает источник данных, инкапсулированный в экземпляре объекта типаParallelQuery.Это дает возможность поддерживать методы расширения параллельных запросов. После вызова данного метода запрос разделяет источник данных на части и оперирует с каждой из них таким образом, чтобы извлечь максимальную выгоду из распараллеливания. (Если распараллеливание оказывается невозможным или неприемлемым, то запрос, как обычно, выполняется последовательно.) Таким образом, добавления в исходный код единственного вызова методаAsParallel() оказывается достаточно для того, чтобы превратить последовательный запрос LINQ в параллельный запрос LINQ. Для простых запросов это единственное необходимое условие.

Существуют как обобщенные, так и необобщенные формы методаAsParallel ().Ниже приведена простейшая обобщенная его форма:

public static ParallelQuery AsParallel(this IEnumerablesource)public static ParallelQuery

AsParallel(this IEnumerablesource)

гдеTSourceобозначает тип элементов в последовательном источнике данных

source.

Ниже приведен пример, демонстрирующий простой запрос PLINQ.

// Простой запрос PLINQ.

using System; using System.Linq;

class PLINQDemo {

static void Main() {

int[] data = new int[10000000];

I

// Инициализировать массив данных положительными значениями, 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;

Перейти на страницу:

Похожие книги