9

多数のデータベースに接続し、多数のファイルを使用する ASP.NET Web ページがあります。ロードが完了する前にエンド ユーザーが Web ページを閉じた場合、つまり ASP.NET ライフ サイクルが終了した場合、またはサーバーがページを生成してクライアントに返そうとするかどうかはわかりません。私はライフサイクルについて合理的な知識を持っていますが、これに関するドキュメントは見つかりません。

潜在的なメモリリークを見つけようとしています。すべてのコードが実行されるかどうか、つまり接続が破棄されるかどうかなどを確認しようとしています。

4

3 に答える 3

8

コードは引き続き実行されます。オブジェクトには、出力のストリーミングなどの操作をループで実行している場合にクライアントがまだ接続されているかどうかを示すことができるプロパティがありIsClientConnectedます。HttpRequest

于 2012-07-02T21:09:10.750 に答える
4

ページへのリクエストが生成されると、ライフサイクルのアンロードに進みます。アンロードに関する情報を送信するまで、クライアントがそこにいないことはわかりません。

これのユニークな側面は、動的コンパイルの部分です。ここでそれを読むことができます:http://msdn.microsoft.com/en-us/library/ms366723

ASP.NETライフサイクルの詳細については、http: //msdn.microsoft.com/en-us/library/ms178472.aspx#general_page_lifecycle_stagesを参照してください。

したがって、基本的に、ページが要求され、ASP.NETは動的コンパイルを使用して基本的にページを作成し、次にページをクライアントに送信しようとします。クライアントがそこにいるかどうかに関係なく、すべてのコードはコードで指定したとおりに実行されます。

これは非常に単純化された答えですが、それが基本です。コードがコンパイルされ、リクエストがレスポンスを生成してから、レスポンスが送信されます。明示的に指示しない限り、分割して送信されることはありません。

編集:言い回しの変更を勧めてくれたChrisLivelyに感謝します。

于 2012-07-02T21:11:28.860 に答える
2

潜在的なメモリリークと「接続」という言葉を追跡することに言及しています。データベース接続を意味していると思います。

using常にすべての接続とコマンドを句でラップする必要があります。これにより、エラーの発生、クライアントの切断などに関係なく、接続/コマンドが適切に破棄されることが保証されます。

ここにはたくさんの例がありますが、要約すると次のようになります。

using (SqlConnection conn = new SqlConnection(connStr)) {
  using (SqlCommand cmd = new SqlCommand(conn)) {
     // do something here.
  }
}

なんらかの理由で、コードでこの方法を実行できない場合は、間違ったことをしたので、次に行うことは再構築することをお勧めします。一般的な問題は、一部の人々がページ実行の上部に接続オブジェクトを作成し、それをページの存続期間中再利用することです。これにより、接続プールでのエラー、メモリの損失、ランダム クエリの問題、アプリの完全なホスティングなどの問題が発生することが保証されています。

コードで接続が必要な時点で接続を確立 (および破棄) することで、パフォーマンスを心配する必要はありません。Windows は超高速の接続プールを使用し、アプリが完了を通知した場合でも、必要な限り接続を維持します。

また、管理されていないクラスを使用するたびに、このパターンを使用する必要があります。それらは常に実装しIDisposableます。

于 2012-07-02T21:40:01.220 に答える