使用 Close() 方法釋放報表

最佳化 Crystal Reports for Visual Studio 專案延展性的另一個方式,就是使用其中一種可用的 Close() 方法來釋放報表所使用的記憶體。

有兩個可用的 Close() 方法:

  • 用於 Crystal Reports 的 ReportDocument.Close()。
  • 用於 RAS SDK 的 ReportClientDocument.Close()。

ReportDocument.Close() 方法

使用 Crystal Reports for Visual Studio 時,您可以使用 ReportDocument.Close() 方法來釋放 Crystal 報表在 Web 伺服器上所耗用的記憶體。

存取 ReportDocument.Close() 方法的方式,依報表為內嵌或非內嵌而定:

  • 如果報表為內嵌,就會產生報表包裝函式類別,以便在程式碼中代表報表。這個報表包裝函式類別繼承自 ReportDocument,因此可以透過繼承存取 Close() 方法。
  • 如果報表為非內嵌,就會從檔案目錄載入至 ReportDocument 執行個體中,因此可以直接從 ReportDocument 類別中存取 Close() 方法。
    Note附註

    如需內嵌與非內嵌報表的詳細資訊,請參閱「我應該使用內嵌或非內嵌的報表?」

Crystal 報表以及 ReportDocument 執行個體都會耗用記憶體,從記憶體釋放 ReportDocument 之後,報表還是會繼續使用記憶體。

例如,假設 ReportDocument 執行個體於網頁載入完畢時超出範圍,當 .NET 記憶體回收丟棄 ReportDocument 執行個體時,ReportDocument 執行個體所使用的記憶體便會從 Web 伺服器中釋放出來,

但報表本身卻仍留在 Web 伺服器的記憶體中。報表是無法移除的,因為存取報表的 ReportDocument 執行個體已不復存在。若在高度延展的情況中一直重複發生這種問題,Web 伺服器記憶體中就會充滿不再需要存取的報表。

若要解決這種問題,則必須呼叫 ReportDocument.Close() 方法,以便在 Web 伺服器上確實關閉報表,並釋放記憶體以供其他報表使用。

呼叫 ReportDocument.Close() 方法的時機

在報表顯示之前,不應該在頁面上呼叫 ReportDocument.Close() 方法;因為即使關閉了報表,如果再一次參考到 ReportDocument,它還是會重新開啟報表。只有在完成顯示處理程序之後,才應該呼叫 Close() 方法。

呼叫 Close() 方法的正確時機是在 Page_Unload 事件發生期間。

ReportClientDocument.Close() 方法

使用 Unmanaged RAS 或 Managed RAS 伺服器時,報表會儲存於報表應用程式伺服器,但在 Web 伺服器上則是以 ReportClientDocument 的執行個體表示。如果 ReportClientDocument 執行個體未呼叫 ReportClientDocument.Close() 方法而超出了範圍,即使不再需要存取報表,報表應用程式伺服器仍會讓報表在記憶體中保持開啟。若在高度延展的情況中一直重複發生這種問題,報表應用程式伺服器上的記憶體就會充滿不再需要於 Web 伺服器存取的報表。

若要解決這種問題,則必須呼叫 ReportClientDocument.Close() 方法,以便在報表應用程式伺服器上確實關閉報表,並釋放記憶體以供其他報表使用。

呼叫 ReportClientDocument.Close() 方法的時機

在報表顯示之前,不應該在頁面上呼叫 Close() 方法;這是因為除非完成了顯示處理程序,否則報表必須在伺服器上保持開啟狀態。

就 ReportClientDocument 執行個體而言,Close() 方法會立即關閉報表,而無法重新予以開啟。因此,如果在顯示報表之前呼叫 Close() 方法,就無法存取報表,並因而擲回例外狀況。

呼叫 Close() 方法的正確時機是在 Page_Unload 事件發生期間。