我正在构建统计信息(多代理)应用程序,我正在使用EF5从代理程序表中检索代理列表。这是一个非常大量的数据(每个区域有大约50 000个代理),需要一次加载以对它们进行一些移民逻辑。我发现(Region).Agents导航属性的加载速度非常慢,但是,在Sql server上执行相同的查询只需1秒。并且foreach也需要相当长的时间。
foreach (OrigineAgent origineAgent in new List<Agent> Origine.Agents.AsParallel()))
{
origineAgent.ScoreCalculator = _container.Resolve<IScoreCalculator>();
origineAgent.AgentExoVariables = AgentVars;
_migrationManager.Migrate(origineAgent);
}
我需要做些什么来增加数据加载和循环性能?
答案 0 :(得分:2)
怎么样:
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
循环源,因为你问题中的那个甚至都没有编译。
答案 1 :(得分:1)
基于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);