2011-10-16 4 views
6

に私は疑問に思って。私は当初、静的コンポーネントがデータベースからいくつかのものをフェッチしてキャッシュとして機能するようにアプリケーションを設計し、コンストラクタから呼び出されたクラスにリフレッシュメソッドを追加しました。リフレッシュメソッドは、アプリケーションの管理部分からも利用可能になりました。ある時点で、この手動トリガーを必要とせずにデータが更新されたことに気付きました。これは、静的コンストラクターが複数回実行されることを意味します。静的クラス<em>ASP.NET MVC</em>アプリで<strong>静的クラス</strong>が<strong></strong>回以上初期化することができればAsp.NET MVCアプリ

未処理のExceptionが再初期化を引き起こすなど、これが合理的に起こることがわかったシナリオがいくつかあります。しかし、私はこれを再現するのに苦労しているので、確かに知りたいです。

+1

あなたのクラスが**完全**スレッドセーフであることを確認してください。 – SLaks

答えて

10

最も一般的なシナリオは次のようになります。

    • は、Web.configファイル
    • は、アウト・オブ・メモリ(
    • 異常終了をバイナリに触れ触れたWebアプリケーションのリロード、許可エラー)
  • アプリケーションプール

  • IISの再起動のリロード
  • アプリドメインがリロードされます

のw3wp.exeの再起動(少なくとも一度は29時間で!)(再コンパイル必要に応じて動的な部分)、静的に初期化されたデータは無効になります。

静的データを作成するのが高価な場合や、AppDomain、アプリケーションプールまたはIISサーバーを再ロードしないように静的データを保存することで回避できます。

更新:フィル・ハークちょうどここに関連するブログエントリを公開し:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

  • バイバイアプリケーションドメイン
    • を、それは上記の説明では、より良い仕事をしていません。注目すべき、IISはそうねえ、私は」、ASP.NETを伝える非常に29最低でも時間との共有ホスティング事業者は、(おそらく、アイドル時間の20分に)はるかに頻繁にAppDomainの
  • をリサイクルします、それはワーカープロセスのリサイクルしますここで働いている!」
    • はあなたのAppDomainの通知を取得するために適用降ろすできる技術について概説 - あなたは
  • 勧告 『正しく』振る舞いあなたのシングルトンのインスタンスを取得するためにこれを使用することができますが

あなたがそれを読むことをお勧めします:)

+0

Update_:Phil Haackは、ちょうどここにrelaventのブログエントリを公開しました:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx 。私は、収集された情報を反映するために答えを更新しました – sehe

+1

私の問題は、アプリケーションプールタイムアウトのリロードが原因であることが最近判明しました。これは、20分以上非アクティブだったアプリケーションを強制終了する予定です。これはWindows Azure上にあり、[この投稿](http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure)は私の問題を解決するのに役立ちました。 – Gleno

4

staticクラスはAppDomainごとに1回初期化されます。

IISがAppDomainをリサイクルすると、すべてが再初期化されます。

+0

IISは、私のAppDomainが気に入ったらそれをリサイクルできますか? – Gleno

+0

はい;それは可能である。私はこれが幾分構成可能だと信じています。 – SLaks

+0

私はAzureを使用して、IIS構成から離れて自分自身を抽象化しています。しかし、これは知って良いです。 – Gleno

関連する問題