Parallel.ForEachAsync внутри Parallel.ForEachAsync, нормально ли?

Рейтинг: 1Ответов: 1Опубликовано: 17.03.2023

Собственно, вопрос в заголовке.
Нормально ли использовать Parallel.ForEachAsync внутри другого Parallel.ForEachAsync?
Есть сгруппированные данные (10х10), нужно их параллельно обработать, друг от друга группы не зависят. Каждую группу надо параллельно тоже обработать.

Так вот, можно ли так делать, чем это грозит, какие могут быть последствия?

Код для примера:

await Parallel.ForEachAsync(Enumerable.Range(0, 10), async (x, ctx) => {

    await Parallel.ForEachAsync(Enumerable.Range(0, 10), async (t, ct) =>
    {
        Console.WriteLine($"element = {t} on {x}");

        await Task.Delay(Random.Shared.Next(100, 5000));
    });

});

Ответы

▲ 1Принят

А есть ли смысл? Обычно такие штуки я делаю так:

private Task DoWork(int x, int t, CancellationToken ct)
{
    Console.WriteLine($"element = {t} on {x}");
    return Task.Delay(Random.Shared.Next(100, 5000), ct);
}
List<Task> tasks = new();
for (int x = 0; x < 10; x++)
{
    for (int t = 0; t < 10; t++)
    {
        tasks.Add(DoWork(x, t, ct));
    }
}
await Task.WhenAll(tasks);

Это даёт мне возможость быстро и гибко управлять процессом обработки, и творить более сложные распараллеливания операций, а не только "всё сразу".

Но ваш код тоже нормальный. Как удобнее, так и делайте. Но 2 вложенных ForEachAsync не позволят наложить общее ограничение на количество выполняемых операций одновременно, а простое добавление семафора в цикл - сможет.