2009-12-08 8 views
6

È possibile utilizzare i metodi static nelle classi ASP.NET Pages e UserControls se non utilizzano alcun membro di istanza? I.e .:I metodi statici nelle classi code-behind ASP.NET non sono 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; 
    } 
} 

O questo non è thread-safe?

+0

Che tipo di variabile è il " comando "oggetto? – Kane

risposta

8

Sì, è possibile utilizzare membri statici, che sono thread-safe. Ogni thread verrà eseguito in un contesto separato e quindi tutti gli oggetti creati all'interno di un metodo statico apparterranno solo a quel thread.

È necessario preoccuparsi solo se un metodo statico accede a un campo statico, ad esempio un elenco. Ma nel tuo esempio il codice è sicuramente thread-safe.

+0

Penso che il tuo commento "puoi usare membri statici" non sia corretto. Un "membro" è un campo, una proprietà o un metodo. Quindi con questa definizione un membro statico (variabile) e un campo statico sono la stessa cosa. Forse intendevi dire che è ok usare i metodi statici. L'affermazione su qualsiasi oggetto creato in un metodo statico appartiene solo a quel thread è fuorviante. Qualsiasi variabile di istanza (non statica) è threadsafe indipendentemente dal fatto che il metodo sia statico o meno. Un metodo statico indica semplicemente che il codice è statico; non dice nulla sulle variabili. – Matt

2

niente condiviso tra i thread, quindi è thread-safe. a meno che non si acceda ai membri statici che altri metodi statici hanno la possibilità di eseguirli contemporaneamente ...

1

lo è. L'unica cosa di cui preoccuparsi nel contesto relativo alla sicurezza del thread è un concetto che coinvolge membri statici, come già detto. Quando qualsiasi metodo (statico o non) accede a un membro statico, è necessario preoccuparsi dei problemi di multithreading. Si consideri il seguente:

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 risposta è: Può essere "42, 43, 0", "42, 0, 1" sai solito prima ..

Problemi correlati