Метод ForEachAsync
Метод ForEachAsync статический,
доступен с .NET 6. Точка входа -
static async Task Main.
В теле можно await.
Синхронный обход -
ForEach.
Сумму наращивают под lock,
как в других примерах раздела.
Синтаксис
await Parallel.ForEachAsync(source, async (item, token) =>
{
});
Пример
Давайте сложить пять чисел
с await Task.CompletedTask:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
int[] items = { 1, 2, 3, 4, 5 };
int sum = 0;
object gate = new object();
await Parallel.ForEachAsync(items, async (item, token) =>
{
await Task.CompletedTask;
lock (gate)
{
sum += item;
}
});
int res = sum;
Console.WriteLine(res);
}
}
Результат выполнения кода:
15
Пример
Давайте накопить сумму через
Interlocked.Add:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
int[] items = { 1, 2, 3, 4, 5 };
int sum = 0;
await Parallel.ForEachAsync(items, async (item, token) =>
{
await Task.CompletedTask;
Interlocked.Add(ref sum, item);
});
int res = sum;
Console.WriteLine(res);
}
}
Результат выполнения кода:
15
Пример
Давайте обойти пустой набор:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
int[] items = { };
int sum = 0;
await Parallel.ForEachAsync(items, async (item, token) =>
{
await Task.CompletedTask;
sum += item;
});
int res = sum;
Console.WriteLine(res);
}
}
Результат выполнения кода:
0