ASP.NET是System.Web.UI.Page线程安全的

时间:2013-01-24 09:24:25

标签: asp.net multithreading

我想知道以下代码是否是线程安全的?

我可以确定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获得SetSomeObjectUniqueFoo来自ASP.NET 根据您的回答,我在static课程中不使用Dummy时会有任何问题吗?

2 个答案:

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