2009-12-08 8 views
6

Puis-je utiliser les méthodes static dans mes classes ASP.NET Pages et UserControls si elles n'utilisent aucun membre d'instance? I.e .:Les méthodes statiques dans les classes code-behind ASP.NET sont-elles non thread-safe?

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

Ou ce n'est pas thread-safe?

+0

Quel type de variable est le " commande "objet? – Kane

Répondre

8

Oui, vous pouvez utiliser des membres statiques - ils sont adaptés aux threads. Chaque thread s'exécutera dans un contexte séparé et par conséquent tous les objets créés dans une méthode statique n'appartiendront qu'à ce thread.

Vous ne devez vous inquiéter que si une méthode statique accède à un champ statique, tel qu'une liste. Mais dans votre exemple, le code est définitivement thread-safe.

+0

Je pense que votre commentaire "vous pouvez utiliser des membres statiques" est incorrect. Un "membre" est un champ, une propriété ou une méthode. Donc, par cette définition, un membre statique (variable) et un champ statique sont la même chose. Peut-être que vous vouliez dire que vous pouvez utiliser des méthodes statiques. La déclaration à propos des objets créés dans une méthode statique n'appartenant qu'à ce thread est trompeuse. Toute variable d'instance (non statique) est threadsafe, que la méthode soit statique ou non. Une méthode statique signifie simplement que le code est statique; il ne dit rien sur les variables. – Matt

2

Rien n'a été partagé entre les threads, il est donc sécurisé. sauf si vous accédez à des membres statiques que d'autres méthodes statiques peuvent exécuter simultanément ...

1

c'est. La seule chose à se soucier dans votre contexte de la sécurité des threads est un concept qui implique des membres statiques, comme déjà dit. Lorsqu'une méthode (statique ou non) accède à un membre statique, vous devez vous soucier des problèmes de multithreading. Considérez ce qui suit:

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

La réponse est la suivante: Il est peut-être "42, 43, 0", "42, 0, 1" vous ne saurez pas avant ..