内存未在TPL中释放

时间:2015-10-08 19:07:25

标签: c# memory-leaks out-of-memory task-parallel-library taskfactory

我正在开发一个报表生成窗口服务,它基本上从数据库中获取数据,在内存中创建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会释放内存。但是内存不断被使用,最终导致内存异常。

我错过了什么或做错了什么? 我很难发布生成报告方法的整个代码,但如果需要,我会尝试发布一些。

0 个答案:

没有答案