这是我遇到的问题(VS 2010,.net 3.5,Crystal Reports 2008):
我有一个窗体frmReports,上面有一个CrystalReportsViewer 控件。此表单由另一个表单的 button_click 实例化。在加载 frmReports 时,会将一个报表文档加载到查看器中,这至少需要 3 分钟才能显示(这里效率不成问题;数据库很大,报表使用存储过程)。
出于这个原因,我创建了一个后台工作人员来检查键盘组合。这应该提示用户他已选择中断加载,处理所有内容并关闭表单(frmReports)。
一切运行良好,发送了关键事件,通知了用户(后台工作人员已正确处理),但是在按 OK 关闭消息框后,主线程保持锁定状态(我无法在任何表单上执行任何操作)。
我使用了 ANTS 内存分析器,所有 CrystalDecisions 程序集仍然加载到内存中,报表文档实际上仍在后台工作。
我已经尝试crViewer.ReportSource.Close()
,将其设置为 = nothing
,ReportSource.Database.Dispose()
更改AppDomain
和卸载程序集,强制GC.Collect()
和许多组合,但没有任何工作 - 报告仍然没有释放其资源并继续尝试在后台加载(我认为一些非托管线程暂停我的程序不会中断任何东西)。
有什么方法可以正确卸载 Crystal Reports 加载的所有内容?或者强行关闭与数据库的连接——水晶报表与数据库的连接(运行附加的存储过程)?