c# - 并行执行使用异步的循环

标签 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 循环不能变为并发/并行。

最佳答案

如果您的目标是同时运行这些,则无需使用 Parallel.Foreach。只需遍历所有组,为执行 SendAsyncforeach 的每个组创建一个任务,获取所有任务,然后全部await立即使用 Task.WhenAll:

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

关于c# - 并行执行使用异步的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725361/

相关文章:

c# - 用于移动应用程序的 .NET Web 服务

javascript - 如何在 Meteor 中使用参数延迟函数?

c# - ASHX 处理程序中的异步发布

C#.NET 3.5 : How to invoke an event handler and wait for it to complete

带有函数访问的全局共享变量的 C++ volatile 关键字

c# - 静默安装 .msu Windows 更新?

c# - 如何指定 AddIn 进程名称?

java - Java中的 volatile 与静态

c# - WCF——解决方案架构

java - 当一个线程在尝试获取锁后被挂起时,是否总是有上下文切换?