繁体   English   中英

并行或异步 ASP.NET Core C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM