次の方法で共有


Close() メソッドによるレポートの解放

Crystal Reports for Visual Studio プロジェクトでスケーラビリティを最適化するもう 1 つの方法は、使用可能な Close() メソッドを使ってレポートが使用しているメモリを解放することです。

次の 2 つの Close() メソッドを使用できます。

  • ReportDocument.Close()(Crystal Reports の場合)
  • ReportClientDocument.Close()(RAS SDK の場合)

ReportDocument.Close() メソッド

Crystal Reports for Visual Studio を使用している場合には、ReportDocument.Close() メソッドを使用して、Web サーバーで Crystal レポートが消費しているメモリを解放できます。

ReportDocument.Close() メソッドのアクセス方法は、埋め込みレポートか埋め込みでないレポートかによって異なります。

  • レポートが埋め込まれている場合、レポート ラッパー クラスが生成され、レポートがコードで表されます。このレポート ラッパー クラスは ReportDocument を継承するため、継承を使用して Close() メソッドにアクセスします。
  • 埋め込みでないレポートの場合、このレポートはファイル ディレクトリから ReportDocument のインスタンスにロードされるため、ReportDocument クラスから直接 Close() メソッドにアクセスします。
    Note

    埋め込みレポートと埋め込みでないレポートの詳細については、「埋め込みレポートと埋め込みでないレポートの選択」を参照してください。

Crystal レポートと ReportDocument のインスタンスは、両方ともそれぞれメモリを消費します。ReportDocument のメモリを解放しても、レポートは引き続きメモリを使用します。

たとえば、Web ページがロードを終了すると、ReportDocument インスタンスは表示されなくなります。.NET のガーベジ コレクションが ReportDocument インスタンスを処理すると、ReportDocument インスタンスによって使用されているメモリが Web サーバーから解放されます。

ただし、このレポート自体は Web サーバーのメモリに残ります。このレポートにアクセスするための ReportDocument インスタンスがすでに存在しないため、これを削除することはできません。このような状態が非常に大きな規模で繰り返された場合、すでに利用されていないレポートによって Web サーバーのメモリがすべて使用されることになります。

この問題の解決には、ReportDocument.Close() メソッドを呼び出します。レポート自体を Web サーバーで閉じることにより、メモリを解放して今後のレポートに使用できるようになります。

ReportDocument.Close() メソッドを呼び出す場合

レポートが完全に表示される前に、そのページに ReportDocument.Close() メソッドを呼び出さないようにしてください。これは、レポートが閉じられている場合でも、そのレポートを再度参照すると、再び ReportDocument が開かれるためです。Close() メソッドは、必ず表示プロセスが完了してから呼び出します。

Close() は、Page_Unload イベント内で呼び出してください。

ReportClientDocument.Close()メソッド

アンマネージド RAS またはマネージド RAS を使用する場合、レポートは Report Application Server に保存されますが、ReportClientDocument のインスタンスによって Web サーバー上に表されます。ReportClientDocument.Close() メソッドを呼び出さずに ReportClientDocument インスタンスが表示されなくなった場合、レポートにはアクセスできなくなりますが、Report Application Server はメモリでレポートを表示し続けます。このような状態を非常に大きな規模で繰り返していると、既に Web サーバー上ではアクセスされていないレポートによって Report Application Server のメモリがすべて使用されることになります。

この問題を解決するには、ReportClientDocument.Close() メソッドを呼び出します。レポートを Report Application Server で閉じることにより、メモリを開放して今後のレポートに使用できるようになります。

ReportClientDocument.Close() メソッドを呼び出すタイミング

レポートを完全に表示する前に Close() メソッドを呼び出さないようにしてください。これは、表示プロセスが完了するまでは、レポートがサーバー上で開かれている必要があるためです。

ReportClientDocument インスタンスの場合は、Close() メソッドによって即座にレポートが閉じられ、これを再度表示することはできません。したがって、レポートを表示する前に Close() メソッドを呼び出すと、レポートはアクセス不可となり、例外がスローされます。

Close() は、Page_Unload イベント内で呼び出してください。