web-dev-qa-db-ja.com

マルチユーザーASP.NET Webアプリケーションの静的変数の範囲

静的変数は、ユーザーセッション間で値を保持しますか?

2つのボタンがあるASP.NET Webアプリケーションがあります。 1つは静的変数値の設定用、もう1つは静的変数値の表示用です。

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);
    }
}

}

これはシングルユーザー環境で動作しますが、2人のコンピューターから同時に2人のユーザーがログインした場合、ユーザー1は値を100に設定し、ユーザー2は値を200に設定します。そのユーザー1が値の取得ボタンを呼び出した後。彼は価値として何を見ますか?

45
Manas Saha

静的変数は、ユーザーセッション間で値を保持しますか?

はい、だからこそ、Webアプリで静的変数を使用するときには非常に注意する必要があります。要求を処理する複数のスレッドが変数の値を変更できるため、同時実行の問題が発生します。

これはシングルユーザー環境で動作しますが、2人のコンピューターから同時に2人のユーザーがログインした場合、ユーザー1は値を100に設定し、ユーザー2は値を200に設定します。そのユーザー1が値の取得ボタンを呼び出した後。彼は価値として何を見ますか?

その後、ユーザーには200が表示されます。

71
Icarus

静的変数のスコープはアプリケーションレベルです。

静的変数に何かを保存する場合、間違いを犯すことは間違いありません。

1人のユーザーがデータ(静的変数)を保存すると、同じ時間に別のユーザーが同じページにアクセスすると、同じデータ(最初に保存されたユーザー)が取得されます。

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

これはあなたのために働くでしょう(あなたがnull値/ -1を処理する必要があることに留意してください):

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