[英]Parallel or async ASP.NET Core C#
我已经在谷歌上搜索了很多,但恐怕我没有完全理解并发和并行的后果。
我有大约 3000 行数据库对象,每个对象平均有 2-4 个逻辑数据附加到它们,需要作为搜索查询的一部分进行验证,这意味着验证服务需要执行大约。 3*3000次。 例如,用户对颜色进行了过滤,然后每一行都需要验证颜色并返回结果。 找到匹配项后,循环不会中断,这意味着始终需要评估所有逻辑对象(这是由于相关性计算,而不是匹配项)。
当用户选择各种属性时,这是按需完成的,这意味着性能是这里的关键。
我目前正在通过使用 Parallel.ForEach 来做到这一点,但想知道使用异步行为是否更聪明?
当前方式
var validatorService = new LogicalGroupValidatorService();
ConcurrentBag<StandardSearchResult> results = new ConcurrentBag<StandardSearchResult>();
Parallel.ForEach(searchGroups, (group) =>
{
var searchGroupResult = validatorService.ValidateLogicGroupRecursivly(
propertySearchQuery, group.StandardPropertyLogicalGroup);
result.Add(new StandardSearchResult(searchGroupResult));
});
异步示例代码
var validatorService = new LogicalGroupValidatorService();
List<StandardSearchResult> results = new List<StandardSearchResult>();
var tasks = new List<Task<StandardPropertyLogicalGroupSearchResult>>();
foreach (var group in searchGroups)
{
tasks.Add(validatorService.ValidateLogicGroupRecursivlyAsync(
propertySearchQuery, group.StandardPropertyLogicalGroup));
}
await Task.WhenAll(tasks);
results = tasks.Select(logicalGroupResultTask =>
new StandardSearchResult(logicalGroupResultTask.Result)).ToList();
并行和异步的区别在于:
这是否有所不同取决于异步方式中阻塞的是什么。 如果您在 CPU 上工作,则是 CPU 阻塞了您,因此您最终仍将拥有多个线程。 如果是 IO(或除 CPU 之外的任何其他内容,您将重用相同的线程)
对于您的特定示例,这意味着以下内容:
Parallel.ForEach
=> 为列表中的每个项目启动新线程(启动的线程数由 CLR 管理)并在不同线程上执行每个项目
async/await
=> 做这点工作,但让我继续执行。 由于您有很多项目,这意味着要多次说这句话。 现在取决于结果如何:
this bit of work
在CPU上,效果是一样的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.