web-dev-qa-db-fra.com

Portée de la variable statique dans une application Web multi-utilisateurs ASP.NET

Les variables statiques conservent-elles leurs valeurs dans les sessions utilisateur?

J'ai une application Web ASP.NET où j'ai deux boutons. Un pour définir la valeur de la variable statique, un autre pour afficher la valeur de la variable statique.

namespace WebApplication1
{   

public partial class WebForm1 : System.Web.UI.Page
{
    public static int customerID;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void ButtonSetCustomerID_Click(object sender, EventArgs e)
    {
        customerID = Convert.ToInt32(TextBox1.Text);
    }

    protected void ButtonGetCustomerID_Click(object sender, EventArgs e)
    {
        Label1.Text = Convert.ToString(customerID);
    }
}

}

Bien que cela fonctionne dans un environnement mono-utilisateur, que se passe-t-il s'il y a 2 utilisateurs connectés simultanément à partir de deux ordinateurs, l'utilisateur 1 définit la valeur sur 100, puis l'utilisateur 2 définit la valeur sur 200. après que l'utilisateur 1 appelle le bouton Get Value. Que verra-t-il comme valeur?

45
Manas Saha

Les variables statiques conservent-elles leurs valeurs dans les sessions utilisateur?

Oui, c'est pourquoi vous devez être TRÈS prudent lorsque vous utilisez des variables statiques dans une application Web. Vous rencontrerez des problèmes de simultanéité car plusieurs threads traitant une demande peuvent modifier la valeur de la variable.

Bien que cela fonctionne dans un environnement mono-utilisateur, que se passe-t-il s'il y a 2 utilisateurs connectés simultanément à partir de deux ordinateurs, l'utilisateur 1 définit la valeur sur 100, puis l'utilisateur 2 définit la valeur sur 200. après que l'utilisateur 1 appelle le bouton Get Value. Que verra-t-il comme valeur?

L'utilisateur en verra 200 par la suite.

71
Icarus

La portée des variables statiques est au niveau de l'application.

Si vous stockez quelque chose dans des variables statiques, vous faites certainement quelque chose de mal.

Si un utilisateur enregistre les données (dans une variable statique), en même temps qu'un autre utilisateur accède à la même page, il obtiendra les mêmes données (premier utilisateur enregistré).

So better you can store the values in **Sessions**.
22
andy

Cela fonctionnerait pour vous (gardez à l'esprit, vous devez gérer les valeurs nulles/-1):

public static int customerID
{
    get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
    set { session["customerID"] = value; }
}
1
sunnysidedown916