2012-06-30 26 views
0

這裏是我遇到的問題(VS 2010,.NET 3.5,水晶報表2008年):如何停止水晶報表加載在VB/C#.NET背景

我有一個形式, frmReports,它有一個CrystalReportsViewer控件。此表單由另一個表單的button_click實例化。在加載frmReports時,會將一個報告文檔加載到查看器中,這需要至少3分鐘的時間才能顯示(效率在這裏沒有問題;數據庫非常大,報告使用存儲過程)。

因爲這個原因,我創建了一個後臺工作人員,檢查鍵盤組合。這應該提示用戶他已選擇中斷加載,處理所有內容並關閉表單(frmReports)。

一切正常,關鍵事件發送,用戶被通知(後臺工作人員正確處理),但在按下確定關閉消息框後,主線程保持鎖定狀態(我無法做任何形式的任何形式)。

我已經使用了ANTS內存分析器,並且所有CrystalDecisions程序集仍然被加載到內存中,並且報告文檔實際上仍在後臺工作。

我試過crViewer.ReportSource.Close(),將其設置爲= nothingReportSource.Database.Dispose(),改變AppDomain和卸載組件,迫使GC.Collect(),許多組合,並沒有什麼工作 - 該報告仍然沒有釋放其資源,並不斷努力在後臺加載(我認爲在一些非託管線程中暫停我的程序不會中斷任何事情)。

是否有任何方法可以正確卸載Crystal Reports加載的所有內容? 或強行關閉與數據庫的連接 - 連接水晶報表與數據庫建立關係(運行附加的存儲過程)?

回答

0

試着用你自己的後臺工作者做這件事,即做一個線程(保持引用不變),啓動它,也啓動一個定時器來檢查取消並取消線程。這可能會更好。

+0

我以前用計時器試過,而且得到了同樣的結果。 **我可以殺死線程**,但不知何故報告會在後臺繼續加載,無論我在後臺工作或主線程中做什麼,我都無法控制它。我認爲查詢繼續在sql服務器上運行,我不知道如何殺死它。請記住,有多個客戶端和一個服務器,因此可能會有許多類似的查詢同時運行,因此我不知道如何確定正確的查詢。 –