6

インスタンスメンバーを使用しない場合static、ASP.NETPagesおよびクラスでメソッドを使用できますか?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;
    }
}

または、これはスレッドセーフではありませんか?

4

3 に答える 3

8

はい、静的メソッドを使用できます-それらはスレッドセーフです。各スレッドは個別のコンテキストで実行されるため、静的メソッド内で作成されたオブジェクトはすべてそのスレッドにのみ属します。

静的メソッドがリストなどの静的フィールドにアクセスしているかどうかだけを心配する必要があります。しかし、あなたの例では、コードは間違いなくスレッドセーフです。

于 2009-12-08T11:49:25.847 に答える
2

スレッド間で共有されるものはないため、スレッドセーフです。他の静的メソッドが同時に実行される可能性がある静的メンバーにアクセスしない限り...

于 2009-12-08T11:39:27.677 に答える
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」の可能性があります。

于 2011-03-11T15:55:38.017 に答える