我正在编写Windows服务,并且正在寻找一种并行执行多个foreach循环的方法,其中每个循环都调用异步(TAP)方法。我最初尝试了以下代码,但由于Parallel.ForEach和async / await不兼容,因此无法正常工作。有谁知道是否有替代方法可以实现这一目标?
Parallel.ForEach(messagesByFromNumber, async messageGroup =>
{
foreach (var message in messageGroup)
{
await message.SendAsync();
}
});
为了清楚起见,由于SendAsync()的运行方式,foreach循环的每个副本必须按顺序执行;换句话说,foreach循环不能同时/并行。
答案 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);