Параллельно обрабатывать огромный список - PullRequest
0 голосов
/ 07 марта 2019

У меня есть некоторые асинхронные функции, и я хотел бы распространить их для их обработки.

1 - Предположим, у меня есть X пользователей (логины); 2 - Для каждого пользователя я должен выполнить несколько задач;

// Пример

foreach (var login in logins)
{
     if (! await _serviceLoginInjected.LogIn (login)) // Injected service
     {
         continues;
     }

     await _serviceLoginInjected.SendEmails();
     await _serviceLoginInjected.CreateFiles();
     await _serviceLoginInjected.DoSomethingElse();
}
  • Очень важно, чтобы между логинами не было конфликтов;
  • Если одна обработка не удалась, не влияйте на другие;
  • Было бы интересно ограничить количество задач, избегая некоторых накладных расходов;

Я действительно потерялся в том, как выполнить эти задачи.

1 Ответ

0 голосов
/ 07 марта 2019

Создайте набор партий, а затем создайте задачу для каждого элемента в пакете, выполняющего работу (параллельно)

async Task Main()
{
    var batchSize = 10;
    var batches = logins.Select((item, inx) => new { item, inx })
                    .GroupBy(x => x.inx / batchSize)
                    .Select(g => g.Select(x => x.item));

    foreach (var batch in batches)
    {
        var tasks = new List<Task>(batchSize);
        foreach (var login  in batch)
        {
            tasks.Add(DoWork());
        }
        await Task.WhenAll(tasks);
    }
}

public async Task DoWork()
{
    if (await _serviceLoginInjected.LogIn(login))
    {
        await _serviceLoginInjected.SendEmails();
        await _serviceLoginInjected.CreateFiles();
        await _serviceLoginInjected.DoSomethingElse();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...