我正在开发一个报表生成 Windows 服务,它基本上会从 DB 中获取数据,在内存中创建 excel,然后将 excel 保存byte[]
在 DB 中。为了加快速度,我决定使用 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()
方法将从数据库中获取每个报告的数据并创建 excel 并将其保存byte[]
在数据库中。所以基本上这是耗时和内存密集型操作。
问题
我的问题是,每当我在服务器中看到任务管理器时,该进程似乎永远不会释放使用的内存。有时当一个任务完成时(我假设它在标志被更新为在 DB 中处理时完成)并且另一个正在等待从 DB 中获取数据,任务管理器中使用的内存保持不变并且随着第二个任务开始处理使用的内存不断增长。
我期待 TPL 会在完成后自动Dispose()
执行任务,并且 GC 会释放内存。但是内存继续被使用,最终我得到内存异常。
我错过了什么或做错了什么?我很难发布生成报告方法的整个代码,但如果需要,我会尝试发布其中的一些。