2013-01-24 27 views
0

我在想如果下面的代碼是線程安全的?ASP.NET是System.Web.UI.Page線程安全

我可以確定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); 
    } 
} 

我以後要在[WebMethod]

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

編輯使用UniqueFoo: 我從JS和UniqueFoo越來越SetSomeObject來自ASP.NET 將ih根據你的回答,在我的Dummy類中沒有使用static時有任何問題嗎?

回答

0

由於您正在修改靜態字段的值,因此您的第二個代碼段不是線程安全的。因此,例如,如果稍後在此頁面中嘗試讀取此UniqueFoo字段的值,則可能無法獲得您期望的值。

第一個代碼片段很好,因爲該字段不是靜態的。

如果你想在WebMethod中使用UniqueFoo,那麼我建議你在調用它的時候把它傳遞給這個web方法。

[WebMethod] 
public static void SetSomeObject(SetSomeObject obj, string uniqueFoo) 
{ 
    SomeThreadSafeWCF service = new SomeThreadSafeWCF(); 
    service.SetSomeObject(uniqueFoo, obj); 
} 
+0

謝謝Darin,關於WebMethod調用。如果我仍然按照我的方式稱呼它,這是否好?我從JS傳遞'SetSomeObject','UniqueFoo'來自ASP.NET。你看到這個問題嗎? – user829174

+0

是的,我看到了問題,因爲您正在重寫每個請求上的靜態字段的值。 –

+0

因此,根據你的建議,我需要從JS中帶來'uniqueFoo'。對?確切地說, – user829174

1

當然第一個樣品是線程安全的,因爲當一個頁面發佈到Web服務器asp.net的請求,讓你的頁面的新實例,並調用的Page_Load所以如果你的SomeThreadSafeWCF.GetUniqueFoo()總是做出獨特Foo一切都是線程保存