并行执行使用异步的循环
本文关键字:循环 异步 并行执行 | 更新日期: 2023-09-27 18:35:44
我正在编写一个Windows服务,正在寻找一种并行执行许多foreach循环的方法,其中每个循环都调用异步(TAP)方法。我最初尝试了以下代码,但不起作用,因为 Parallel.ForEach 和 async/await 不兼容。有谁知道是否有替代方法可以实现这一目标?
Parallel.ForEach(messagesByFromNumber, async messageGroup =>
{
foreach (var message in messageGroup)
{
await message.SendAsync();
}
});
为了清楚起见,由于 SendAsync() 的操作方式,foreach 循环的每个副本都必须串行执行;换句话说,foreach 循环不能变为并发/并行。
如果您的目标是同时运行这些,则无需使用Parallel.Foreach
。只需遍历所有组,为每个组创建一个执行SendAsync
foreach
的任务,获取所有任务,然后使用Task.WhenAll
一次await
它们:
var tasks = messagesByFromNumber.Select(async messageGroup =>
{
foreach (var message in messageGroup)
{
await message.SendAsync();
}
});
await Task.WhenAll(tasks)
您可以使用 AsyncEnumerator NuGet 包使其更加严格:
using System.Collections.Async;
await messagesByFromNumber.ParallelForEachAsync(async messageGroup =>
{
foreach (var message in messageGroup)
{
await message.SendAsync();
}
}, maxDegreeOfParallelism: 10);