我正在编写一个 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
的每个组创建一个任务,获取所有任务,然后全部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/