これが私が遭遇している問題です(VS 2010、.net 3.5、Crystal Reports 2008):
CrystalReportsViewerコントロールを持つフォームfrmReportsがあります。このフォームは、別のフォームのbutton_clickによってインスタンス化されます。frmReportsをロードすると、レポートドキュメントがビューアにロードされます。表示には少なくとも3分かかります(ここでは効率は問題になりません。データベースは非常に大きく、レポートはストアドプロシージャを使用します)。
このため、キーボードの組み合わせをチェックするバックグラウンドワーカーを作成しました。これは、ユーザーがロードを中断し、すべてを破棄してフォーム(frmReports)を閉じることを選択したことをユーザーに促すことになっています。
すべてが非常にうまく機能し、キーイベントが送信され、ユーザーに通知されます(バックグラウンドワーカーは適切に破棄されます)が、[OK]を押してメッセージボックスを閉じた後、メインスレッドはロックされたままになります(どのフォームでも何もできません)。
私はANTSメモリプロファイラーを使用しましたが、すべてのCrystalDecisionsアセンブリはまだメモリにロードされており、レポートドキュメントは実際にはバックグラウンドで機能しています。
私は試しましたcrViewer.ReportSource.Close()
、それを=に設定しnothing
、アセンブリReportSource.Database.Dispose()
を変更しAppDomain
てアンロードし、強制しGC.Collect()
、そして多くの組み合わせを実行しましたが、何も機能しませんでした-レポートはまだリソースを解放せず、バックグラウンドでロードしようとし続けます(私はプログラムを一時停止しても何も中断されないため、管理されていないスレッドもあります)。
ロードされたCrystalReportsをすべて適切にアンロードする方法はありますか?または、データベースへの接続を強制的に閉じるために-Crystal Reportsがデータベースと行う接続(添付のストアドプロシージャを実行するため)?