我正在开发一个报表生成窗口服务,它基本上从数据库中获取数据,在内存中创建excel,然后将Excel中的excel保存为byte[]
。
为了加快速度,我决定使用TPL,下面是我编写的一些代码。
List<ReportData> lstRd = new List<ReportData>();
List<Task> tasks = new List<Task>;
foreach (var item in lstRd)
{
tasks.Add(Task.Factory.StartNew(GenerateReport()));
}
Task.WaitAll(tasks.ToArray());
tasks.ForEach(x=>
if(!x.IsCompleted)
x.Wait());
Task.Factory.ContinueWhenAll(tasks.ToArray(),StopService());
GenerateReport()
方法将从DB获取每个报告的数据,并创建excel并将byte[]
保存在db中。所以基本上这是时间和内存密集型操作。
问题
我的问题是,每当我在服务器中看到任务管理器时,该过程似乎永远不会释放所使用的内存。有时当一个任务完成时(我假设它在标记更新为在DB中处理时完成)而另一个任务正在等待从DB获取数据,任务管理器中使用的内存保持不变,并且第二个任务开始处理使用的内存不断增长。
我期待TPL完成后会自动Dispose()
任务,GC会释放内存。但是内存不断被使用,最终导致内存异常。
我错过了什么或做错了什么? 我很难发布生成报告方法的整个代码,但如果需要,我会尝试发布一些。