ASP.NET代码隐藏类中的静态方法是否是非线程安全的?

时间:2009-12-08 11:35:32

标签: c# .net asp.net thread-safety static-methods

如果他们不使用任何实例成员,我可以在我的ASP.NET staticPages类中使用UserControls方法吗?即:

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gridStatement.DataSource = CreateDataSource();
    gridStatement.PageIndex = e.NewPageIndex;
    gridStatement.DataBind();
}

private static DataTable CreateDataSource()
{
    using (var command = new SqlCommand("SELECT foobar"))
    {
        var table = new DataTable();
        new SqlDataAdapter(command).Fill(table);
        return table;
    }
}

或者这不是线程安全的吗?

3 个答案:

答案 0 :(得分:8)

是的,您可以使用静态成员 - 它们是线程安全的。每个线程都将在一个单独的上下文中执行,因此在静态方法中创建的任何对象都只属于该线程。

如果静态方法正在访问静态字段(例如列表),则只需要担心。但在您的示例中,代码绝对是线程安全的。

答案 1 :(得分:2)

没有在线程之间共享,因此它是线程安全的。除非你访问静态成员,否则其他静态方法有可能与它同时执行......

答案 2 :(得分:1)

是的。在您的上下文中,关于线程安全性唯一要担心的是涉及静态成员的概念,如前所述。 当任何方法(静态或非静态)访问静态成员时,您应该担心多线程问题。 请考虑以下事项:

public class RaceConditionSample
{
    private static int number = 0;
    public static int Addition()
    {
        int x = RaceConditionSample.number;
        x = x + 1;
        RaceConditionSample.number = x;
        return RaceConditionSample.number;
    }

    public int Set()
    {
        RaceConditionSample.number = 42;
        return RaceConditionSample.number;
    }

    public int Reset()
    {
        RaceConditionSample.number = 0;
        return RaceConditionSample.number;
    }
}

RaceConditionSample sample = new RaceConditionSample();
System.Diagostics.Debug.WriteLine(sample.Set());

// Consider the following two lines are called in different threads in any order, Waht will be the
// output in either order and/or with any "interweaving" of the individual instructions...?
System.Diagostics.Debug.WriteLine(RaceConditionSample.Addition());
System.Diagostics.Debug.WriteLine(sample.Reset());

答案是:它可能是“42,43,0”,“42,0,1”,你以前不知道......