我有下面的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条答案
按热度按时间eoxn13cs1#
如果它的来源是
IQueryable<T>
,其中allUsers
来自EF,那么EF提供了一些自定义扩展API来执行异步查询,如EntityFrameworkQueryableExtensions
中所列,包括.ToListAsync()
之类的东西。如果数据已经在内存中,并且您正在使用LINQ-to-Objects,则:不。“异步”和“并行”之间有很大的区别;在本地执行异步操作,如果它是CPU绑定的,而不是在外部资源上被阻塞,那么它几乎没有任何收益。“异步”的意义在于释放那些在外部IO上被阻塞的线程;这里不适用。
ffscu2ro2#
正如Marc Gravell提到的,除非涉及到某种io,否则使用“真实的的”异步调用几乎没有意义。
但是,您可以尝试使用支持.Join()的.AsParallel()。您也可以使用Task.Run在后台线程上运行查询,以将执行从主线程移走,避免阻塞。