我有一个WindowsService,它通过LocalReports(RDLC报告)将XML文件转换为PDF。它工作得非常好并且速度很快,但是我遇到了与here类似的内存泄漏问题。
.Render("PDF")
方法似乎是出现问题的地方。 VS2015中的性能分析会话显示了ServerIdentity
使用的大量内存。如果我发表评论.Render("PDF")
,则不会显示。
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记忆。答案 0 :(得分:0)
将应用程序的编译目标更改为x64并调用
report.ReleaseSandboxAppDomain();
渲染方法之后。记住要处置报告对象。