2012-04-13 5 views
1

静的変数が複数のクラスに分散している.NET Webアプリケーションを持っている場合は、それをすべてクリアして戻すことができます。 我々が作成するのに費用がかかるいくつかの非常に大規模な辞書のコレクションをキャッシュし、そして上のされている - 私の頭の上オフ.NETアプリケーションですべての静的変数を「リセット」する最善の方法

、それは問題の背後にある

System.Web.HttpRuntime.UnloadAppDomain() 

理由を使用してアプリケーションを再起動することです奇妙な機会をリセットする必要があります。

+2

あなたはより多くを与えることができますそれを望んでいる理由と、静的変数を使い始めるのが実現可能かどうかということですか? –

+5

静的変数を持つウェブアプリ??非常に冒険的で、ロードバランシングにはあまり適していません。 – Matten

+1

アセンブリ全体の反復的な反射、perchance? –

答えて

5

最も簡単な方法でサウンドをアンロードすることはできますが、あまり頻繁にやりたくはありません。率直に言って、私はこれを行うための日常的な要求に非常に疑わしいでしょう。

にはをアンロードしない場合は、その意味を理解するためにケースバイケースで検討する必要があります。特に、静的コンストラクタ/型初期化子/静的フィールド初期化子によって値に設定された何かを強制的にヌルに設定すると、アプリケーションを完全に破壊する可能性があります。

静的変数は、おそらくキャッシュを除いてウェブアプリにはあまり適していないことに注意してください(注意深く管理する必要があります)。

複数の静的変数ではなく、インスタンスの変数を疑似シングルトンとして役立つ状態クラスに置くと、クラスタごとにスワップする参照が1つしかありません。データ。

すなわち静的コードが自分自身を初期化するときに、必要なときに一度だけ、そのイベントをトリガを購読することができ、どこかのイベントをしている検討する価値があるかもしれません何か、

myStaticData = new SomeExpensiveThreadSafeCacheDictionary(); 
GlobalKillSwitch.ResetCache += delegate { myStaticData.Clear(); }; 
+1

"静的変数はウェブアプリケーションにはあまり適していません" - なぜですか?私はあなたが正しいのかどうか、本当に興味があるのか​​どうかについては疑問を呈していません。なぜなら、Googleのさらなる情報を見つけることができないように思われるからです。 – SkonJeet

+1

@SkonJeet Webアプリケーションは多くのリクエストを処理するため、リクエストで使用されるデータの大部分はそのリクエストに固有のものであり、他のリクエストに影響を与える可能性のある静的フィールドの近くでは、そのリクエストを望まないでしょう。静的フィールドを使用する場合は、スレッド安全性(複数の競合のない無関係な要求とパイプライン中に異なるスレッド間でジャンプする単一の要求の両方)を考慮する必要があります。私は間違ってはいけません:彼らは使用しています...しかし、多くの注意点があります –

+0

@SkonJeetまた、ASP.NETは通常IISを意味します。 IISはワーカープロセスを自由にリサイクルし、リサイクル時には静的変数を格納します。常にそれを再初期化しなければならないのは、それが何のために使用されているかによって問題になるかもしれません。 –

関連する問題