【问题标题】:Can I make a Linq join asynchronous?我可以让 Linq 异步加入吗?
【发布时间】:2021-05-24 10:12:33
【问题描述】:

我有以下 linq,我想让它异步以提高性能。这可能吗?由于这是一个连接,我认为由于性能原因可以使其异步,但我使用的命令似乎没有异步等效项。有没有等价物,为什么不呢?

var usersindomain = allUsers
  .Join(allUserStatus, usr => usr.EIN, us => us.EIN, (usr,us) => new { usr,us})
  .Where(result => result.us.DomainID == id)
  .OrderBy(order => order.us.Status)
  .Select (z => new { EIN = z.usr.EIN, FullName = z.usr.FullName, Status = z.us.Status });               

【问题讨论】:

  • 我真的不认为异步会提高性能;也许您可以找到一种使用 AsParallel 的方法。
  • 这是什么框架? EF Core,我想现在的EF6,都有异步方法来实现查询结果。

标签: c# linq asp.net-core asynchronous


【解决方案1】:

如果它的来源是IQuerable<T>,其中allUsers 来自EF,那么EF 提供了一些自定义扩展API 来执行异步查询,如EntityFrameworkQueryableExtensions 中所列,包括.ToListAsync() 之类的东西。这样做的主要目的是异步执行 远程 SQL 查询

如果数据已经在内存中,并且您正在使用 LINQ-to-Objects,那么:不。 “异步”和“并行”之间存在巨大差异;如果它受 CPU 限制而不是在外部资源上被阻塞,则在本地执行异步操作本身几乎没有收益。 “异步”的重点是释放在外部 IO 上会被阻塞(例如)的线程;这不适用于此处。

【讨论】:

    【解决方案2】:

    正如 Marc Gravell 所提到的,除非涉及某种 io,否则使用“真正的”异步调用几乎没有意义。

    不过有支持.Join().AsParallel(),你可以试试。您还可以使用Task.Run 在后台线程上运行查询,以将执行从主线程中移出并避免阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2011-10-31
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2019-04-21
      相关资源
      最近更新 更多