我想知道以下代码是否是线程安全的?
我可以确定UniqueFoo
确实是唯一的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);
}
修改:
我从JS获得SetSomeObject
,UniqueFoo
来自ASP.NET
根据您的回答,我在static
课程中不使用Dummy
时会有任何问题吗?
答案 0 :(得分:1)
当然你的第一个样本是线程安全的,因为当一个页面的请求发布到Web服务器asp.net时会创建你的页面的新实例并调用page_load,所以如果你的SomeThreadSafeWCF.GetUniqueFoo()总是创建一个唯一的Foo一切都是线程保存
答案 1 :(得分:0)
您的第二个代码段不是线程安全的,因为您正在修改静态字段的值。因此,例如,如果您在此页面的后面尝试读取此UniqueFoo
字段的值,则可能无法获得预期的值。
第一个代码段很好,因为该字段不是静态的。
如果你想在WebMethod中使用UniqueFoo,那么我建议你在调用时将它传递给这个web方法。
[WebMethod]
public static void SetSomeObject(SetSomeObject obj, string uniqueFoo)
{
SomeThreadSafeWCF service = new SomeThreadSafeWCF ();
service.SetSomeObject(uniqueFoo, obj);
}