gpt4 book ai didi

c# - 并行或异步 ASP.NET Core C#

转载 作者:行者123 更新时间:2023-11-30 23:05:02 25 4
gpt4 key购买 nike

我已经在谷歌上搜索了很多,但恐怕我并不完全理解并发和并行的后果。

我有大约 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 => 完成这部分工作,但让我继续执行。因为你有很多项目,这意味着多次说这个。现在取决于结果:

  • 如果 这一点工作在 CPU 上,效果是一样的
  • 否则,当工作在其他地方完成时,您将只使用一个线程

关于c# - 并行或异步 ASP.NET Core C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49005046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com