49

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

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 が [値の取得] ボタンを呼び出します。彼は何を価値として見るでしょうか?

4

4 に答える 4

76

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

はい、そのため、Web アプリで静的変数を使用するときは非常に注意する必要があります。リクエストにサービスを提供する複数のスレッドが変数の値を変更できるため、同時実行の問題が発生します。

これはシングルユーザー環境で機能しますが、2 台のコンピューターから同時にログインしている 2 人のユーザーがいるとどうなりますか。ユーザー 1 が値を 100 に設定し、次にユーザー 2 が値を 200 に設定します。その後、ユーザー 1 が [値の取得] ボタンを呼び出します。彼は何を価値として見るでしょうか?

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

于 2013-01-04T10:04:03.897 に答える
25

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

静的変数に何かを保存する場合、間違いなく何か間違ったことをしています。

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

So better you can store the values in **Sessions**.
于 2013-01-04T10:03:20.513 に答える
1

これはうまくいきます(null値/-1を処理する必要があることに注意してください):

public static int customerID
{
    get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
    set { session["customerID"] = value; }
}
于 2014-06-04T16:37:16.983 に答える