Are static methods in ASP.NET code-behind classes non-thread-safe?

左心房为你撑大大i 提交于 2019-12-10 13:32:22

问题


Can I use static methods in my ASP.NET Pages and UserControls classes if they don't use any instance members? I.e.:

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;
    }
}

Or this is not thread-safe?


回答1:


Yes, you can use static members - they are thread-safe. Each thread will execute in a separate context and therefore any objects created inside a static method will only belong to that thread.

You only need to worry if a static method is accessing a static field, such as a list. But in your example the code is definitely thread-safe.




回答2:


nothing shared across threads, so it is thread safe. unless you access static members that other static methods have a chance of executing concurrently with it...




回答3:


it is. The only thing to worry about in your context about thread-safeness is a concept that involves static members, as already said. When any method (static or not) accesses a static member, you should worry about multithreading issues. Consider the following:

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());

The answer is: It may be "42, 43, 0", "42, 0, 1" you wont know before..



来源:https://stackoverflow.com/questions/1866407/are-static-methods-in-asp-net-code-behind-classes-non-thread-safe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!