1

これが私が遭遇している問題です(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がデータベースと行う接続(添付のストアドプロシージャを実行するため)?

4

1 に答える 1

0

独自のバックグラウンド ワーカーでこれを実行してみてください。つまり、スレッドを作成し (参照 -volatile を保持)、開始し、タイマーを開始してキャンセルをチェックし、キャンセル時にスレッドを強制終了します。これはうまくいくかもしれません。

于 2012-06-30T17:52:08.087 に答える