Asp.net core mvc 与ToList()相比,ToListSync()非常慢

Asp.net core mvc 与ToList()相比,ToListSync()非常慢,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,我有一个复杂的LINQ查询,带有分组和多个包含。我发现ToListAsync()需要更长的时间才能完成,而ToList()只需几分之一秒即可返回 allReservationsList = allReservations.ToList(); // fast allReservationsList = await allReservations.ToListAsync(); // more then a second for 60 rows 我是否做错了什么,或者这是实体框架的问题 以下是查询:

我有一个复杂的LINQ查询,带有分组和多个包含。我发现ToListAsync()需要更长的时间才能完成,而ToList()只需几分之一秒即可返回

allReservationsList = allReservations.ToList(); // fast
allReservationsList = await allReservations.ToListAsync(); // more then a second for 60 rows
我是否做错了什么,或者这是实体框架的问题

以下是查询:

            var reservations = db.Reservations
                .Include(r => r.PickUpLocation)
                .Include(r => r.ReturnLocation)
                .Include(r => r.RequestedVehicleModel).ThenInclude(m => m.Photos)
                .Include(r => r.RequestedVehicleModel.VehicleType.VehicleModels)
                .Include(r => r.RequestedVehicleType).ThenInclude(t => t.Photos)
                .Include(r => r.AssignedUnit.VehicleModel.VehicleType)
                .Include(r => r.DailyPrice.Currency);

            var allReservations =
                from r in reservations
                orderby r.VersionDate descending
                group r by r.BookingCode into g
                select g;

这里的变量太多了。然而,一般来说,异步方法比同步方法需要更长的时间才能返回,这仅仅是因为异步有更多的开销。无论这是否是您看到的整个延迟的原因,至少从您提供的信息来看,没有办法确定。

如中所述,如果您使用的是大型列类型(blob、
varchar(max)
等),那么在使用
ToListAsync()
时,请使用Entity Framework 6。我不能说我100%理解这种情况的复杂性,但我可以说,如果您正在检索这样的大数据值,您使用
ToList()
是正确的。

请提供您的查询和相关代码好吗?我唯一能说的就是克里斯说的贝娄。由于开销,一次操作的异步速度总是比同步调用慢。@MaximerUiller我添加了查询。性能上的差异太大,无法用开销(可能是100秒)来解释。这几乎可以肯定是因为Photos表包含varbinary(max)和/或[n]varchar(max)列。我添加了这个查询。我会理解50%,甚至100%的差异。但我看到的可能是100秒的时差。ToList()几乎立即完成,而ToListSync()需要一秒钟以上的时间。在VS诊断工具中,我可以在CPU利用率图上清楚地看到它——一个小而短的峰值与一秒多的高负载。同样,变量太多,无法说明发生了什么。不过,对我来说,这似乎是一种未成熟的优化。发布到生产环境的代理,加载并在那里对其进行配置。如果在这一点上有问题,那么您可以继续尝试优化。至少在那一点上,你会有更多的相关数据要处理。就目前情况而言,我要说的是不要担心。这正是我开始考虑这个问题的原因:在生产环境中,响应时间太慢。所以我找出了什么函数调用使它变慢,用同步模拟代替了它,它解决了性能问题。它可以像这样工作,但我觉得很奇怪,异步调用比同步调用慢数百倍。除了固有的开销之外,唯一能让异步花费更长时间的是如果没有可用的线程。与同步操作一样,如果所有线程都被占用,那么您将排队,一旦异步操作需要继续处理,在放弃其线程后,它必须等待线程可用,如果没有线程,它将排队。但是,如果发生这种情况,那么您的服务器将承受太多的负载,您需要为其提供更多的资源。即使在一个测试环境中,我也可以看到这一点,只需要一个请求。此外,CPU利用率图表显示高CPU负载超过一秒钟,因此它实际上在做一些CPU密集型的事情。我将其更改为ToList(),调用速度更快!