0

次のコードがスレッドセーフかどうか疑問に思っていますか?

UniqueFooそれが実際にUnique Fooになり、オーバーライドされないことを確認できますか?

public partial class Dummy : System.Web.UI.Page
{
    public string UniqueFoo{ get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var id = int.Parse(Request["Id"]);
        UniqueFoo = SomeThreadSafeWCF.GetUniqueFoo(id);
    }
}

次はどうですか(静的)

public partial class Dummy : System.Web.UI.Page
{
    public static string UniqueFoo{ get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var id = int.Parse(Request["Id"]);
        UniqueFoo = SomeThreadSafeWCF.GetUniqueFoo(id);
    }
}

後で使用UniqueFooしたい[WebMethod]

[WebMethod]
public static void SetSomeObject(SetSomeObject obj)
{
    SomeThreadSafeWCF service = new SomeThreadSafeWCF ();
    service.SetSomeObject(UniqueFoo, obj);
}

編集:私はSetSomeObjectJS から取得しUniqueFooており、ASP.NET から取得しています。回答によるとstatic、クラスで を使用しない場合に問題はありますか?Dummy

4

2 に答える 2

1

確かに最初のサンプルはスレッド セーフです。なぜなら、ページのリクエストが Web サーバー asp.net に投稿されると、ページの新しいインスタンスが作成され、page_load が呼び出されるためです。

于 2013-01-24T09:34:09.137 に答える
0

2 番目のコード スニペットは、静的フィールドの値を変更しているため、スレッド セーフではありません。たとえば、このページの後半でこのUniqueFooフィールドの値を読み取ろうとすると、期待する値が得られない可能性があります。

フィールドは静的ではないため、最初のコード スニペットは問題ありません。

WebMethod で UniqueFoo を使用する場合は、呼び出すときにこの Web メソッドに渡すことをお勧めします。

[WebMethod]
public static void SetSomeObject(SetSomeObject obj, string uniqueFoo)
{
    SomeThreadSafeWCF service = new SomeThreadSafeWCF ();
    service.SetSomeObject(uniqueFoo, obj);
}
于 2013-01-24T09:26:29.623 に答える