并行执行使用异步的循环

本文关键字:循环 异步 并行执行 | 更新日期: 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);