Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
int[] modThreeIsZero = (
from num in source.AsParallel()
where num % 3 == 0
orderby num descending select num).ToArray();
Обратите внимание, что общий формат запроса LINQ идентичен тому, что вы видели в предыдущих главах. Тем не менее, за счет включения вызова
AsParallel()
Отмена запроса PLINQ
С помощью объекта
CancellationTokenSource
Program
CancellationTokenSource
_cancelToken
CancellationTokenSource _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/catch
ProcessInData()
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# появились два новых ключевых слова, которые дополнительно упрощают процесс написания асинхронного кода. По контрасту со всеми примерами, показанными ранее в главе, когда применяются ключевые слова
async
await
System.Threading
System.Threading.Tasks
Знакомство с ключевыми словами async и await языка C# (обновление в версиях 7.1, 9.0)
Ключевое слово
async
async
async
await
В целях иллюстрации создайте новый проект консольного приложения по имени
FunWithCSharpAsync
Program.cs
System.Threading
System.Threading.Task
System.Collections.Generic
DoWork()