La durée de vie de ASP.NET Variable Statique
Je suis contenant de l'information dans les variables statiques définies dans la classe de la page (pas au Mondial.asax). Je ne déclarer la variable dans le code comme:
protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;
et de définir la variable dans PageLoad événement. Par exemple, je vérifie l'ID de la base de données, si elle est différente de SomeGlobalUnsecureID, je l'ai mise à jour SomeGlobalUnsecureID et de la Chaîne à partir de quelque part d'autre, sinon de les laisser comme c'est. Ceci est parfaitement en sécurité dans mon application. la logique (c'est à dire celles données ne sont pas sécurisées, tout le monde peut y accéder, pas de problème); la seule chose que je veux accomplir est
-
Contenir la même quantité de mémoire, indépendamment d'utilisateurs connectés
-
Changer si et seulement si persistante info est différente de celle de
la "mémoire" (parce qu'en fait, la lecture de la chaîne de beaucoup de temps pour
moi.
Maintenant, depuis que je fais le check-in PageLoad, je n'ai pas de problèmes dans reloaded pages. Cependant, ma page est pleine de WebMethods, et parfois, je vois que les variables statiques sont remis à zéro. Et la partie étrange est, la session est toujours actif, même lorsque les variables statiques sont mis à zéro (donc-> pas de serveur ou de l'application. piscine redémarrer etc.)
C'est vraiment étrange pour moi. Je suppose que la variable statique tiendra sa valeur jusqu'à ce que l'application (en quelque sorte) se termine. Mais même la Session n'a pas de date d'expiration, la variable statique est remis à zéro. Que proposez-vous? Est l'aide de variables d'application un meilleur choix? Tous les documents que j'ai lu sur le web suggèrent variables statiques au lieu de variables d'application, dois-je les déclarer en quelque sorte différent?
- Les déclarations en haut de votre question ne sont pas statiques, btw.
- 🙂 ok, corrigé
- "définir la variable dans PageLoad événement.' Je pense que tu veux dire initialiser? La définition d'une variable est ce que vous faites lorsque vous écrivez
protected static int Something;
- "Maintenant, depuis que je fais le check-in PageLoad, je n'ai pas de problèmes dans reloaded pages." - cela sonne comme une condition de concurrence en attente de se produire. Je voudrais examiner thread-safe initialisation à la place.
- Statique lass dure jusqu'à la prochaine recycler. Mettez vos variables dans une classe statique de l'utiliser dans d'autres
Vous devez vous connecter pour publier un commentaire.
Variables statiques sont conservées pendant la durée de vie du domaine de l'application. Donc les deux choses qui vont entraîner vos variables statiques pour "reset" est un domaine de l'application du redémarrage ou de l'utilisation d'une nouvelle classe. Dans votre cas avec des variables statiques stockées dans une Page aspx classe, vous risquez de perdre les variables statiques lorsque ASP.NET décide de recompiler la Page aspx dans une nouvelle classe, en remplacement de l'ancienne classe de la page avec le nouveau.
Pour ces raisons, si le système de décider de redémarrer ou de remplacer la classe (.NET n'est pas de tuer ou de décharger les classes/assemblées dans une application en cours d'exécution de domaine) puis de vos variables statiques sera remise à zéro parce que vous êtes l'obtention d'une nouvelle classe avec le redémarrer ou de remplacement. Cela s'applique à la fois à des Pages aspx et les classes dans le dossier App_Code
ASP.NET va remplacer une classe, si pour une raison quelconque, pense que la nécessité de recompiler (voir ASP.NET la compilation dynamique).
Vous ne pouvez pas éviter la perte de variables statiques à partir d'un domaine d'application redémarrer, mais vous pouvez essayer de l'éviter, de la classe de remplacement. Vous pourriez mettre vos variables statiques dans une classe qui n'est pas une page aspx et n'est pas dans le répertoire App_Code. Vous pourriez souhaitez les placer sur une
static class
quelque part dans votre programme.Les variables statiques sont par pool, c'est-à-dire que si vous avez 2 piscines qui exécute votre asp.net site, vous avez 2 différentes variables statiques. (Web jardin mode)
Les variables statiques sont perdues si le système redémarre votre asp.net demande à l'un de cette façon.
Cette variables statiques ne sont pas thread-safe, et vous devez utiliser la de verrouillage mot-clé particulier si vous accéder à partir de différents threads.
Depuis une application redémarrage réinitialiser votre statique n'importe quoi, si vous voulez vraiment persister vos données, vous devez stocker les données dans une base de données à l'aide de classes personnalisées. Vous pouvez stocker des informations par l'utilisateur dans L'État De Session avec un base de données d'état de session en mode. ASP.NET l'État de l'Application/les Variables ne seront pas vous aider parce que ils sont stockés dans la mémoire, pas la base de données, de sorte qu'ils sont perdus sur le domaine de l'application de redémarrer trop.
or if create a new thread for the same page for two different users
Je ne pense pas que ce serait la cause, parce que les threads partagent la mémoire statique dans le même domaine d'application. C'est seulement le chargement d'une DLL ou un redémarrage du domaine de l'application qui réinitialise les variables statiques.static global class
. Il y a justestatic class
.Je pense que les deux points suivants sont également importants pour la durée de vie des variables statiques:
1 - Dans votre application de la piscine, les paramètres avancés, cochez la case "Recyclage" -> "Intervalle de Temps Régulier (minutes)" réglage. C'est la valeur par défaut est de 1740 qui signifie que dans chaque 29 heures de vos variables statiques sont perdus à cause de recyclage de votre pool d'applications. Ce paramètre est utilisé pour la résiliation de possibles fuites de mémoire. Je ne voudrais pas changer ce paramètre..
2 - En application de la piscine, les paramètres avancés, cochez la case "Modèle de Processus" -> "délai d'Inactivité (en minutes)" réglage. C'est la valeur par défaut est de 20, ce qui signifie dans chaque 20 minutes d'inactivité dans votre pool d'applications, les processus de travail sont résiliés/suspendu qui sera la cause de votre variables statiques pour être perdu. Ce paramètre est utilisé pour libérer des ressources lors de l'application de la piscine n'est pas utilisée dans un certain laps de temps. Vous pouvez le mettre à 0 pour désactiver le délai d'attente.
Variable statique est utilisée pour stocker l'ensemble de l'objet de la même valeur