并行处理巨大清单

时间:2019-03-07 14:55:24

标签: c# asynchronous parallel-processing task

我具有一些异步功能,并且希望将其分发以对其进行处理。

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 :(得分:0)

创建一组批处理,然后为该批处理中的每个项目创建任务(并行)

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();
    }
}