性能问题:使用EF5从数据库加载数据,使用foreach循环
本文关键字:使用 数据 foreach 循环 加载 问题 EF5 性能 数据库 | 更新日期: 2023-09-27 18:09:03
我正在构建一个统计(多代理)应用程序,我使用EF5从代理表中检索代理列表。每次需要加载非常大量的数据(每个地区大约50,000个代理),以便对它们进行一些迁移逻辑。我发现(地区)。代理导航属性加载非常非常慢,但是,在Sql服务器上执行相同的查询只需要1秒。并且foreach也需要相当长的循环时间。
foreach (OrigineAgent origineAgent in new List<Agent> Origine.Agents.AsParallel()))
{
origineAgent.ScoreCalculator = _container.Resolve<IScoreCalculator>();
origineAgent.AgentExoVariables = AgentVars;
_migrationManager.Migrate(origineAgent);
}
我必须做些什么来提高数据加载和循环性能?
怎么样:
var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
origineAgent.ScoreCalculator = resolved
origineAgent.AgentExoVariables = AgentVars;
_migrationManager.Migrate(origineAgent);
}
我已经在循环之前移动了_container.Resolve<IScoreCalculator>();
并固定了您的foreach
循环源,因为您的问题中的一个甚至没有编译。
以MarcinJuraszek的帖子为基础,以下内容如何:
List<Task> tasks = new List<Task>();
var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
origineAgent.ScoreCalculator = resolved
origineAgent.AgentExoVariables = AgentVars;
Task t = Task.Factory.StartNew((arg) => { _migrationManager.Migrate((OrigineAgent)arg); }, origineAgent);
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
并行调用_migrationManager.Migrate(origineAgent);