我可以让 Linq 加入异步吗?

时间:2021-05-24 10:12:33

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

我有以下 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 });               

2 个答案:

答案 0 :(得分:2)

如果它的来源是 IQuerable<T>,其中 allUsers 来自 EF,那么 EF 会提供一些自定义扩展 API 来执行异步查询,如 EntityFrameworkQueryableExtensions 中所列,包括诸如 { {1}}。这样做的主要目的是异步执行远程 SQL 查询

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

答案 1 :(得分:1)

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

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