4

に配置されているプロジェクトで一時データベースを使用していますApplication_End:

protected void Application_End() {
    if (_db != null) _db.Dispose();
}

問題は、Web プロジェクトを閲覧しているときに Application_End が頻繁に呼び出されるように見えることです。データベース内のオブジェクトを編集すると、変更が正常に行われ、データベースが破棄され、リダイレクトされるまでにインデックス - 新しいデータベースが作成され、何も起こらなかったかのように変更されていないオブジェクトが表示されます。

Application_End は、セッションが終了したとき、または一定のアイドル時間の後にのみ呼び出されるべきではありませんか?

アプリケーションの使用が実際に終了したときにのみ Application_End が呼び出されるようにする方法を誰か教えてもらえますか?

4

1 に答える 1

11

問題は、Web プロジェクトを閲覧しているときに Application_End が頻繁に呼び出されるように見えることです。

これは、AppDomain がアンロードされたときに発生します。デバッグ中は、プロジェクトを再コンパイルするたびに発生しますが、これは通常、binフォルダー内のアセンブリを再コンパイルするたびに再生成され、ASP.NET は単にアプリケーション ドメインをリサイクルするためです。

アプリケーションを IIS にデプロイすると、IIS がアプリケーションのリサイクルを決定した場合にのみ発生します。これは、さまざまな状況で発生する可能性があります。特定の期間の非アクティブ、CPU/メモリのしきい値に達した、...

Application_End は、セッションが終了したとき、または一定のアイドル時間の後にのみ呼び出されるべきではありませんか?

いいえ、Application_Endユーザー セッションとは関係ありません。これは、アプリケーション ドメインの寿命の終わりに呼び出されます。

アプリケーションの使用が実際に終了したときにのみ Application_End が呼び出されるようにする方法を誰か教えてもらえますか?

これApplication_Endは、アプリケーション ドメインをアンロードする準備ができたときに、ASP.NET ランタイムによって呼び出されます。

したがって、これを回避したい場合は、インメモリ ストレージではなく、永続的なデータベースを使用する必要があります。インメモリ ストレージを使用すると、アプリケーションの寿命に縛られます。

于 2012-01-24T09:33:29.407 に答える