我有以下 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 });
答案 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 在后台线程上运行查询以将执行从主线程移走并避免阻塞。