1

这是我遇到的问题(VS 2010,.net 3.5,Crystal Reports 2008):

我有一个窗体frmReports,上面有一个CrystalReportsViewer 控件。此表单由另一个表单的 button_click 实例化。在加载 frmReports 时,会将一个报表文档加载到查看器中,这至少需要 3 分钟才能显示(这里效率不成问题;数据库很大,报表使用存储过程)。

出于这个原因,我创建了一个后台工作人员来检查键盘组合。这应该提示用户他已选择中断加载,处理所有内容并关闭表单(frmReports)。

一切运行良好,发送了关键事件,通知了用户(后台工作人员已正确处理),但是在按 OK 关闭消息框后,主线程保持锁定状态(我无法在任何表单上执行任何操作)。

我使用了 ANTS 内存分析器,所有 CrystalDecisions 程序集仍然加载到内存中,报表文档实际上仍在后台工作。

我已经尝试crViewer.ReportSource.Close(),将其设置为 = nothingReportSource.Database.Dispose()更改AppDomain和卸载程序集,强制GC.Collect()和许多组合,但没有任何工作 - 报告仍然没有释放其资源并继续尝试在后台加载(我认为一些非托管线程暂停我的程序不会中断任何东西)。

有什么方法可以正确卸载 Crystal Reports 加载的所有内容?或者强行关闭与数据库的连接——水晶报表与数据库的连接(运行附加的存储过程)?

4

1 回答 1

0

尝试使用您自己的后台工作人员执行此操作,即创建一个线程(保持引用-volatile),启动它,还启动一个计时器以检查取消并在取消时终止线程。这可能会更好。

于 2012-06-30T17:52:08.087 回答