并行执行使用异步的循环

时间:2014-12-31 19:09:17

标签: c# asynchronous concurrency parallel-processing async-await

我正在编写Windows服务,并且正在寻找一种并行执行多个foreach循环的方法,其中每个循环都调用异步(TAP)方法。我最初尝试了以下代码,但由于Parallel.ForEach和async / await不兼容,因此无法正常工作。有谁知道是否有替代方法可以实现这一目标?

Parallel.ForEach(messagesByFromNumber, async messageGroup =>
{
    foreach (var message in messageGroup)
    {
        await message.SendAsync();
    }
});

为了清楚起见,由于SendAsync()的运行方式,foreach循环的每个副本必须按顺序执行;换句话说,foreach循环不能同时/并行。

2 个答案:

答案 0 :(得分:5)

如果您的目标是同时运行这些目标,则无需使用Parallel.Foreach。只需遍历所有群组,为执行foreach SendAsync的每个群组创建任务,完成所有任务,并await一次Task.WhenAll一次完成任务:

var tasks = messagesByFromNumber.Select(async messageGroup =>
{
    foreach (var message in messageGroup)
    {
        await message.SendAsync();
    }
});
await Task.WhenAll(tasks)

答案 1 :(得分:0)

您可以使用AsyncEnumerator NuGet Package

更加轻松
using System.Collections.Async;

await messagesByFromNumber.ParallelForEachAsync(async messageGroup =>
{
    foreach (var message in messageGroup)
    {
        await message.SendAsync();
    }
}, maxDegreeOfParallelism: 10);