我目前正在开发一个小型模拟实用程序,使用任务并行库来提高生成结果的速度。模拟本身是一项长期的、cpu 密集型的工作,它基本上由数千个运行具有不同变量的模拟的较小工作组成。
但是,每个任务使用的资源直到一切都完成后才会释放,如果使用了足够多的变量,就会导致内存泄漏和内存不足异常。在每个任务结束时强制 GC 会释放资源,但我的理解是这需要中断所有线程才能执行,因此导致接近单线程性能!
如何在这样的长时间操作中释放资源?
在这种情况下,“资源”指的是双打数组……其中很多。
public List<AnalysisTask> Questions; //Each variable combination is added as a Q
//Create a task for each simulation
Task<SimulationResults>[] tasks = new Task<SimulationResults>[Questions.Count];
foreach(var q in Questions)
{
AnalysisTask temp = q
tasks[taskCount] = Task.Factory.StartNew((t) =>
{
var result = EvaluateRules(temp);
if(reults.Value > Leader[0].Value)
Leader[0] = result;
else
{
result.Dispose();
//This releases resources but interrupts threads
//GC.Collect(2, GCCollectionMode.Forced);
return null;
}
return result;
}
}
//Completion task
Task.Factory.ContinueWhenAll(tasks, (ant) =>
{
DoSomethingWithAnswer(Leader[0]);
}
也许我在设置任务时采取了错误的方法?我将不胜感激任何建议或方向:)