Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
throughnothingbusinessanotherlookingprisonerCruncherLongest word is: undistinguishableПомочь удостовериться в том, что приложение задействует все доступные процессоры машины, может параллельный вызов методов
FindTenMostCommon()FindLongestWord()GetStats():void GetStats(){ // Получить слова из электронной книги. string[] words = _theEBook.Split( new char[] { ' ', 'u000A', ',', '.', ';', ':', '-', '?', '/' }, StringSplitOptions.RemoveEmptyEntries); string[] tenMostCommon = null; string longestWord = string.Empty; Parallel.Invoke( () => { // Найти 10 наиболее часто встречающихся слов. tenMostCommon = FindTenMostCommon(words); }, () => { // Найти самое длинное слово. longestWord = FindLongestWord(words); }); // Когда все задачи завершены, построить строку, // показывающую все статистические данные. ...}Метод
Parallel.Invoke()Action<>Запросы Parallel LINQ (PLINQ)
В завершение знакомства с библиотекой TPL следует отметить, что существует еще один способ встраивания параллельных задач в приложения .NET Core. При желании можно применять набор расширяющих методов, которые позволяют конструировать запрос LINQ, распределяющий свою рабочую нагрузку по параллельным потокам (когда это возможно). Соответственно запросы LINQ, которые спроектированы для параллельного выполнения, называются запросами Parallel LINQ (PLINQ).
Подобно параллельному коду, написанному с использованием класса
ParallelВо время выполнения PLINQ анализирует общую структуру запроса, и если есть вероятность, что запрос выиграет от распараллеливания, то он будет выполняться параллельно. Однако если распараллеливание запроса ухудшит производительность, то PLINQ просто запустит запрос последовательно. Когда возникает выбор между потенциально затратным (в плане ресурсов) параллельным алгоритмом и экономным последовательным, предпочтение по умолчанию отдается последовательному алгоритму.
Необходимые расширяющие методы находятся в классе
ParallelEnumerableSystem.Linq
Чтобы взглянуть на PLINQ в действии, создайте проект консольного приложения по имени
PLINQDataProcessingWithCancellationSystem.LinqSystem.ThreadingSystem.Threading.Tasksusing System;using System.Linq;using System.Threading;using System.Threading.Tasks;Console.WriteLine("Start any key to start processing"); // Нажмите любую клавишу, чтобы начать обработкуConsole.ReadKey();Console.WriteLine("Processing");Task.Factory.StartNew(ProcessIntData);Console.ReadLine();void ProcessIntData(){ // Получить очень большой массив целых чисел. int[] source = Enumerable.Range(1, 10_000_000).ToArray(); // Найти числа, для которых истинно условие num % 3 == О, // и возвратить их в убывающем порядке. int[] modThreeIsZero = ( from num in source where num % 3 == 0 orderby num descending select num).ToArray(); // Вывести количество найденных чисел Console.WriteLine($"Found {modThreeIsZero.Count()} numbers that match query!");}Создание запроса PLINQ
Чтобы проинформировать библиотеку TPL о выполнении запроса в параллельном режиме (если такое возможно), необходимо использовать расширяющий метод
AsParallel()