Microsoft расширила класс ParallelEnumerable специально для Linq (этот тип также находится в пространстве имен System.Linq), а предоставляемый им метод расширения позволяет Linq поддерживать параллельные вычисления, которые называются PLinq.
Традиционные вычисления Linq являются однопоточными, а PLinq — параллельными и многопоточными, например:
class Program
{
static void Main(string[] args)
{
List<int> intList = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from p in intList select p;
Console.WriteLine("Следующий вывод Linq:");
foreach (int item in query)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine("Далее параллельный вывод PLinq:");
var queryParallel = from p in intList.AsParallel() select p;
foreach (int item in queryParallel)
{
Console.WriteLine(item.ToString());
}
Console.ReadKey();
}
}
Вот вывод Linq:
0
1
2
3
4
5
6
7
8
9
Вот параллельный вывод PLinq:
0
1
9
2
4
6
8
3
5
7
Другой способ параллельного вывода:
queryParallel.ForAll((item) => {
Console.WriteLine(item.ToString());
});
Использование ForAll игнорирует запрос AsOrdered запроса. пример:
Console.WriteLine("Далее параллельный последовательный вывод PLinq:");
var queryParallel = from p in intList.AsParallel().AsOrdered() select p;
foreach (int item in queryParallel)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine("Ниже приведены параллельные выходные данные PLinq ForAll:");
queryParallel.ForAll((item) => {
Console.WriteLine(item.ToString());
});
Вот параллельный последовательный вывод PLinq:
0
1
2
3
4
5
6
7
8
9
Вот вывод параллельного ForAll PLinq:
9
2
3
8
4
5
6
7
0
1
Сортировка после параллельного запроса приведет к снижению производительности. Некоторые методы расширения сортируют элементы по умолчанию. К этим методам относятся OrderBy, OrderByDescending, ThenBy и ThenByDescending, а также некоторые методы запроса, такие как Take.