Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
int[] modThreeIsZero = ( from num in source.AsParallel() where num % 3 == 0 orderby num descending select num).ToArray();Обратите внимание, что общий формат запроса LINQ идентичен тому, что вы видели в предыдущих главах. Тем не менее, за счет включения вызова
AsParallel()Отмена запроса PLINQ
С помощью объекта
CancellationTokenSourceProgramCancellationTokenSource_cancelTokenCancellationTokenSource _cancelToken = new CancellationTokenSource();do{ Console.WriteLine("Start any key to start processing"); // Нажмите любую клавишу, чтобы начать обработку Console.ReadKey(); Console.WriteLine("Processing"); Task.Factory.StartNew(ProcessIntData); Console.Write("Enter Q to quit: "); // Введите Q для выхода: string answer = Console.ReadLine(); // Желает ли пользователь выйти? if (answer.Equals("Q", StringComparison.OrdinalIgnoreCase)) { _cancelToken.Cancel(); break; }}while (true);Console.ReadLine();Теперь запрос PLINQ необходимо информировать о том, что он должен ожидать входящего запроса на отмену выполнения, добавив в цепочку вызов расширяющего метода
WithCancellation()try/catchProcessInData()void ProcessIntData(){ // Получить очень большой массив целых чисел. int[] source = Enumerable.Range(1, 10_000_000).ToArray(); // Найти числа, для которых истинно условие num % 3 == 0, // и возвратить их в убывающем порядке. int[] modThreeIsZero = null; try { modThreeIsZero = (from num in source.AsParallel().WithCancellation(_cancelToken.Token) where num % 3 == 0 orderby num descending select num).ToArray(); Console.WriteLine(); // Вывести количество найденных чисел. Console.WriteLine($"Found {modThreeIsZero.Count()} numbers that match query!"); } catch (OperationCanceledException ex) { Console.WriteLine(ex.Message); }}Во время выполнения метода
ProcessIntData()Асинхронные вызовы с помощью async/await
В этой довольно длинной главе было представлено много материала в сжатом виде. Конечно, построение, отладка и понимание сложных многопоточных приложений требует прикладывания усилий в любой инфраструктуре. Хотя TPL, PLINQ и тип делегата могут до некоторой степени упростить решение (особенно по сравнению с другими платформами и языками), разработчики по-прежнему должны хорошо знать детали разнообразных расширенных приемов.
С выходом версии .NET 4.5 в языке программирования C# появились два новых ключевых слова, которые дополнительно упрощают процесс написания асинхронного кода. По контрасту со всеми примерами, показанными ранее в главе, когда применяются ключевые слова
asyncawaitSystem.ThreadingSystem.Threading.TasksЗнакомство с ключевыми словами async и await языка C# (обновление в версиях 7.1, 9.0)
Ключевое слово
asyncasyncasyncawaitВ целях иллюстрации создайте новый проект консольного приложения по имени
FunWithCSharpAsyncProgram.csSystem.ThreadingSystem.Threading.TaskSystem.Collections.GenericDoWork()