0

我正在构建一个统计(多代理)应用程序,我正在使用 EF5 从代理表中检索代理列表。需要一次加载大量数据(每个地区大约 50 000 个代理)才能对它们进行一些移民逻辑。我发现 (Region).Agents 导航属性的加载速度非常慢,但是在 Sql 服务器上执行相同的查询只需 1 秒。并且 foreach 也需要相当长的时间循环。

foreach (OrigineAgent origineAgent in new List<Agent> Origine.Agents.AsParallel()))
{
    origineAgent.ScoreCalculator = _container.Resolve<IScoreCalculator>();
    origineAgent.AgentExoVariables = AgentVars;
    _migrationManager.Migrate(origineAgent);
}

我必须做些什么来提高数据加载和循环性能?

4

2 回答 2

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循环源,因为您的问题中的那个甚至没有编译。

于 2013-04-13T12:04:13.140 回答
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);

于 2013-04-15T09:28:20.683 回答