【发布时间】:2012-06-25 17:38:12
【问题描述】:
我目前正在开发一个小型模拟实用程序,使用任务并行库来提高生成结果的速度。模拟本身是一项耗时的、占用大量 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]);
}
也许我在设置任务时采取了错误的方法?我将不胜感激任何建议或方向:)
【问题讨论】:
-
第二段描述了问题和症状。下面给出的所有 3 个答案都有助于改进代码,但主要问题已通过有关任务数组所持有的引用的公认答案得到解决。
标签: c# multithreading memory-leaks garbage-collection task