2009-12-08 11 views
6

¿Puedo utilizar los métodos static en mis clases ASP.NET Pages y UserControls si no utilizan ningún miembro de instancia? Es decir .:¿Los métodos estáticos en las clases de código subyacente de ASP.NET no son seguros para subprocesos?

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 esto no es seguro para subprocesos?

+0

Qué tipo de variable es el " comando "objeto? – Kane

Respuesta

8

Sí, puede usar miembros estáticos, son seguros para subprocesos. Cada hilo se ejecutará en un contexto separado y, por lo tanto, cualquier objeto creado dentro de un método estático solo pertenecerá a ese hilo.

Solo debe preocuparse si un método estático está accediendo a un campo estático, como una lista. Pero en su ejemplo, el código definitivamente es seguro para subprocesos.

+0

Creo que su comentario "puede usar miembros estáticos" es incorrecto. Un "miembro" es un campo, propiedad o método. Entonces, según esa definición, un miembro estático (variable) y un campo estático son la misma cosa. Quizás quisiste decir que está bien usar métodos estáticos. La declaración sobre cualquier objeto creado en un método estático que solo pertenecerá a ese hilo es engañosa. Cualquier variable de instancia (no estática) es segura para procesos, independientemente de si el método es estático o no. Un método estático simplemente significa que el código es estático; no dice nada sobre las variables. – Matt

2

nada compartido entre subprocesos, por lo que es seguro para subprocesos. a menos que acceda a miembros estáticos que tienen otros métodos estáticos para ejecutar al mismo tiempo ...

1

es. Lo único de lo que debe preocuparse en su contexto acerca de la seguridad de subprocesos es un concepto que involucra miembros estáticos, como ya se dijo. Cuando cualquier método (estático o no) accede a un miembro estático, debe preocuparse por problemas de subprocesamiento múltiple. Considere lo siguiente:

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 respuesta es: Puede ser "42, 43, 0", "42, 0, 1" usted no sabe antes ..

Cuestiones relacionadas