2012-04-13 3 views
1

Schrecklich beiseite, wenn ich eine .NET-Webanwendung habe, die statische Variablen über mehrere Klassen verstreut hat, was ist der beste Weg, sie alle auf null 'zu löschen'.Der einfachste Weg, um alle statischen Variablen in einer .NET-Anwendung zu "zurücksetzen"

Aus der Spitze von meinem Kopf, wäre es die Anwendung neu starten

System.Web.HttpRuntime.UnloadAppDomain() 

Gründe hinter der Frage mit - wir ein paar sehr großen Wörterbuch Sammlungen sind das Caching, die erstellen teuer sind und auf der seltsame Gelegenheit muss zurückgesetzt werden.

+2

Könnten Sie mehr geben Gründe dafür und ob es machbar * nicht * wäre, statische Variablen zu verwenden, um damit zu beginnen? –

+5

eine Web-App mit statischen Variablen ?? klingt sehr abenteuerlich und nicht wirklich zum Lastenausgleich geeignet. – Matten

+1

Rekursive Reflexion der gesamten Baugruppe, vielleicht? Damit kann man nichts falsch machen –

Antwort

5

Entladen klingt am einfachsten, aber das möchten Sie nicht sehr oft tun; ehrlich gesagt, würde ich jede routinemäßige Anforderung, dies zu tun, sehr bezweifeln.

Wenn Sie es tun wollten ohne entladen, müssten Sie von Fall zu Fall schauen, um die Auswirkungen zu verstehen. Insbesondere das zwangsweise Setzen von "number" auf null, das vom statischen Konstruktor/type initializer/static field initializer auf einen Wert gesetzt wurde, kann die Anwendung gründlich durchbrechen.

Beachten Sie, dass statische Variablen selten für Web-Anwendungen geeignet sind, außer vielleicht für Caches (und müssen dann sorgfältig verwaltet werden).

Wenn Sie wirklich Daten wie diese haben zu tun, anstatt mehrere statische Variablen können Sie bei Instanz Variablen auf einer Zustandsklasse suchen, die Hilfe als pseudo-Singleton ist - dann nur Sie eine Referenz haben pro Cluster tauschen Daten.

Etwas, das könnte eine Überlegung wert ist, ein Ereignis irgendwo mit, dass der statische Code abonnieren können nur einmal, wenn sich die Initialisierung, dann das Ereignis auslösen, wenn nötig, das heißt

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

"Statische Variablen sind selten für Web-Apps geeignet" - warum? Ich frage nicht, ob Sie Recht haben oder nicht, wirklich interessiert, warum - kann nicht scheinen, weitere Informationen über Google zu finden. – SkonJeet

+1

@SkonJeet, weil Webanwendungen mit vielen Anfragen umgehen; Die meisten Daten, die in einer Anfrage verwendet werden, sind spezifisch für diese Anfrage, und Sie möchten sie nicht in der Nähe eines statischen Feldes haben, das sich auf andere Anfragen auswirken könnte. Wenn Sie ** ein ** statisches Feld verwenden, müssen Sie die Thread-Sicherheit berücksichtigen (beides aus mehreren konkurrierenden, nicht zusammenhängenden Anfragen und aus einer einzelnen Anfrage, die während der Pipeline zwischen verschiedenen Threads springt). Versteh mich nicht falsch: sie haben eine Verwendung ... aber: mit vielen Vorbehalten –

+0

@SkonJeet Auch ASP.NET bedeutet in der Regel IIS. IIS recycelt den Worker-Prozess nach Belieben, beim Recyceln wird die statische Variable in Binned unterteilt. Ständig muss es neu initialisiert werden, je nachdem, wofür es verwendet wird. –