LocalReport渲染导致OutOfMemory异常

时间:2015-10-27 18:54:54

标签: c# pdf out-of-memory rdlc reportviewer

我有一个WindowsService,它通过LocalReports(RDLC报告)将XML文件转换为PDF。它工作得非常好并且速度很快,但是我遇到了与here类似的内存泄漏问题。

.Render("PDF")方法似乎是出现问题的地方。 VS2015中的性能分析会话显示了ServerIdentity使用的大量内存。如果我发表评论.Render("PDF"),则不会显示。

功能

  • 应用程序是.NET 4.5
  • 应用程序使用VS2012的ReportViewer库(我也试过2015年,并且行为相同)
  • 专为'任何CPU'构建,可能以x86运行
  • 报告不是很大,但是我们运行了很多,所以几周之后内存就用完了(1页报告,每天可能有十几个或更多)。

代码

public static byte[] GenerateReport(string name, IEnumerable<ReportDataSource> dataSources)
    {
        try
        {
            byte[] pdfBytes; 
            using (Stream reportStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name))
            {
                LocalReport localReport = new LocalReport();
                localReport.LoadReportDefinition(reportStream);

                foreach (var dataSource in dataSources)
                {
                    localReport.DataSources.Add(dataSource);
                }

                pdfBytes = localReport.Render("PDF");

                //Cleanup!
                localReport.DataSources.Clear();
                localReport.ReleaseSandboxAppDomain();
                localReport.Dispose();
            }

            return pdfBytes;
        }
        catch (Exception ex)
        {
            throw new Exception("Error generating report at " + name, ex);
        }
    }

其他说明

  • 如果我从不打电话给.Render("PDF"),那么内存永远不会超过20MB左右。
  • 同样,如果我从不渲染,那么堆中没有ServerIdentity或Microsoft.ReportingServices.OnDemanProcessing。*`对象。这是90%以上的内存消耗,但我没办法GC记忆。

1 个答案:

答案 0 :(得分:0)

将应用程序的编译目标更改为x64并调用

report.ReleaseSandboxAppDomain();

渲染方法之后。记住要处置报告对象。