【发布时间】:2014-12-31 19:09:17
【问题描述】:
我正在编写一个 Windows 服务,并且正在寻找一种方法来并行执行多个 foreach 循环,其中每个循环都会调用一个异步 (TAP) 方法。我最初尝试了以下代码,它不起作用,因为 Parallel.ForEach 和 async/await 不兼容。有谁知道是否有替代方法可以实现这一目标?
Parallel.ForEach(messagesByFromNumber, async messageGroup =>
{
foreach (var message in messageGroup)
{
await message.SendAsync();
}
});
为了清楚起见,由于 SendAsync() 的操作方式,foreach 循环的每个副本都必须串行执行;换句话说,foreach 循环不能并发/并行。
【问题讨论】:
-
我不完全相信你会需要并行,因为异步调用是一种即发即忘类型的方法。只需为每个标准做一个标准并触发 async 方法应该做一些非常接近你想要它做的事情
-
@theDarse 我不能使用标准 foreach 作为外循环的原因是因为 SendAsync() 方法太慢了,以至于我需要外循环有机会在单独的线程上运行。执行两个嵌套的标准 foreach 循环将花费太长时间。
-
不要混合并行和异步代码。当您不想烧毁线程(通常是 I/O 调用)时使用异步,并行用于在所有内核上并行执行 CPU 密集型计算。
标签: c# asynchronous concurrency parallel-processing async-await