【发布时间】:2021-01-15 00:15:23
【问题描述】:
过去几天我一直在研究这个问题,但我似乎无法弄清楚。
我有一个c# WinForms 应用程序,它使用ReportDocument 加载报表并将其放入Crystal Report Viewer,以便用户可以预览它。目的是预览不同的统计数据,并且表单永远不会关闭。有一个计时器可以运行并将不同的报告加载到查看器中。
虽然发生这种情况,但内存使用量和句柄(我可以在任务管理器中看到它们)不断增加。当应用程序启动时,它使用大约 30 MB,当它运行 10 分钟时,它使用大约 200 MB,并且不断增加。
我在互联网上阅读了很多有关此问题的信息,发现ReportDocument 和查看器都需要关闭和处置。不幸的是,这并不能解决问题。报告中的连接类型为 OLE DB(ADO),因为数据是从 SQL Server 数据库中检索的。
简而言之,Form1 有一个计时器,当它经过时会释放Crystal Reports Viewer 并调用垃圾收集器。然后加载新报告。
这是我的示例代码
表格1:
private ReportDocument rpt;
private void timer2_Tick(object sender, EventArgs e)
{
timer2.Enabled = false;
try
{
panel1.Hide();
if (rpt != null)
{
foreach (Table t in rpd.Database.Tables)
t.Dispose();
rpt.Close();
rpt.Dispose();
rpt = null;
GC.Collect();
}
panel1.Controls.Remove(CRVviewer);
if (CRVviewer != null)
{
CRVviewer.Dispose();
GC.Collect();
}
// The problem starts from here:
var report = navigationbar1.CurrentNode;
rpt = new ReportDocument();
rpt.Load(@report.Path, OpenReportMethod.OpenReportByDefault);
rpt.ReportOptions.EnableSaveDataWithReport = false;
rpt.SetDatabaseLogon(report.UserId, report.Password);
rpt.VerifyDatabase();
// It ends here
CRVviewer = new CrystalReportViewer();
CRVviewer.ReportSource = rpt;
CRVviewer.ShowLastPage();
pagecount = CRVviewer.GetCurrentPageNumber();
CRVviewer.ShowFirstPage();
panel1.Controls.Add(CRVviewer);
this.Update();
}
catch(Exception ex)
{
ProcessErrors(ex);
}
finally
{
timer2.Enabled = true;
}
}
问题来自数据库连接,因为如果我加载本地报告,它工作正常。但是我做错了什么?
【问题讨论】:
标签: c# .net winforms memory-leaks crystal-reports