День сто девятый. #ЗаметкиНаПолях

PLINQ

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

Рассмотрим следующий пример:

public static string GetAllFacebookUserLikesMessage(IEnumerable<FacebookUser> facebookUsers)

{

var seed = default(UInt64);

Func<UInt64, UInt64, UInt64> threadAccumulator = (t1, t2) => t1 + t2;

Func<UInt64, UInt64, UInt64> threadResultAccumulator = (t1, t2) => t1 + t2;

Func<Uint64, string> resultSelector = total => $"Facebook has {total} likes!";



return facebookUsers.AsParallel()

.Aggregate(seed, threadAccumulator, threadResultAccumulator, resultSelector);

}

Этот код разделит facebookUsers между системными потоками по мере необходимости, суммирует общее количество лайков в каждом потоке параллельно, суммирует результаты, вычисленные каждым потоком, и выдаст полученный результат в строке (см. диаграмму ниже).

Параллелизуемые задания, использующие ресурсы ЦП, которые можно легко выразить через LINQ (другими словами, чистые функции без побочных эффектов) являются отличными кандидатами для PLINQ. Для работы с заданиями, которые имеют побочный эффект, рекомендуется рассмотреть возможность использования библиотеки параллельных задач.



Источник: https://docs.microsoft.com/en-us/dotnet/standard/using-linq