我有一个使用 EF4(System.Data.Entities,没有 nuget 包)并直接针对 LINQ 查询命中上下文的项目。每当我通过让多个用户登录(使用 VS 测试负载测试)进行负载测试时,我的性能很糟糕,我的 CPU 会达到 100%,并且 VS.NET 会在高 .NET 锁争用和高垃圾收集时发出警报。
在进行大量分析和调整时,一切似乎都指向 LINQ 查询本身的执行(在某种程度上是可以预期的),以及我们在一堆中进行的 .ToList() 调用的大量争用放在结果上。
有没有人经历过这个?是什么原因,我该如何解决?出于某种原因,我是否需要退出 .ToList() 调用?
更新:一些人要求提供更多详细信息。这是有问题的代码(稍微调整以删除我无法发布的内容)。
var query =
from f in context.fs
where f.usr.Any((u) => u.id == id)
select new
{
FS = f,
f.fList,
E = from e in f.fList select new { e.er },
L = from l in f.fList select new { l.id }
};
var res = query.ToList();
在重负载下,相同的代码在多个线程上运行(分析器说 13)。ToList() 调用是绝对的谋杀,几乎是所有延迟的原因。