2009-04-23 19 views
5

He visto mucha discusión sobre este tema aquí.Una pregunta sobre C# y las clases y funciones estáticas

Si tengo una clase estática con métodos estáticos que se conectan a una base de datos o un servidor, ¿es una mala idea usar esto en un entorno multiusuario (como una página web)? ¿Esto haría que la nueva banda de rodadura de un usuario espere a que los hilos de los usuarios anteriores finalicen sus llamadas antes de aceptar una nueva?

¿Cuáles serían las implicaciones de esto con multi-threading, también?

Thx!

Respuesta

6

Si cada método estático es totalmente responsable de la adquisición de sus recursos y luego desechar su recursos dentro del alcance de la llamada a método (sin estado compartido), entonces no debería tener ningún problema con el enrutamiento que no tendría utilizando clases de instancia. Sugeriría, sin embargo, que el problema más grande es que la dependencia de los métodos públicos estáticos (en clases estáticas o no estáticas) crea muchos otros problemas de diseño en el futuro.

  • En primer lugar, está vinculando muy estrechamente a una implementación, que siempre es mala.
  • En segundo lugar, probar todas las clases que dependen de sus métodos estáticos se vuelve muy difícil de hacer, porque está bloqueado en una sola implementación.
  • En tercer lugar, resulta muy fácil crear métodos que no sean seguros para subprocesos, ya que los métodos estáticos solo pueden tener un estado estático (que se comparte en todas las llamadas a métodos).
0

Static solo define el alcance donde se define el método y cómo se enlaza/llama. No tiene nada que ver con multi threading.

Debe tener cuidado con los campos estáticos. Ellos son compartidos por todos los hilos. Los hilos no están esperando el uno al otro, pero necesita bloqueos para que funcione.

Pero si su aplicación es un poco más compleja que Hello World, debería considerar tener sus métodos no estáticos sino usar patrones orientados a objetos.

3

Los métodos estáticos no tienen ningún comportamiento especial con respecto al multihilo. Es decir, puede esperar varias "copias" del método ejecutándose al mismo tiempo. Lo mismo ocurre con las variables estáticas: diferentes subprocesos pueden acceder a todos a la vez, no hay espera allí. Y a menos que tengas cuidado, esto puede crear caos.

1

Sí, es una mala idea.

Cuando se utiliza una conexión para todos los usuarios si alguien realiza una acción que requiere, digamos 15 segundos, sólo para el acceso de base de datos, todos los demás usuarios tendrán que esperar el fin de conectar a la base de datos

+0

La mala idea aquí es el uso de una conexión, no de los métodos estáticos, IMO. –

+0

Estoy de acuerdo contigo – Sergio

0

Si utiliza una conexión estática para acceder a la base de datos, deberá sincronizar las llamadas a métodos. Múltiples hilos que piden datos a la base de datos a través de una única conexión ... ehhmmm ... estropearán las cosas. Por lo tanto, está serializando el acceso a los datos de todos los hilos y esto tendrá un gran impacto en el rendimiento.

Si cada llamada abre su propia conexión, no necesita serializar todos los hilos porque no hay una conexión compartida. Crear una conexión por solicitud sigue siendo un diseño costoso.

Si usa un grupo de conexiones estáticas, reducirá este impacto en el rendimiento porque solo necesita serializar el acceso al grupo de conexiones.

Además, las estáticas en general no son una buena decisión de diseño: hacen las pruebas unitarias muy complicadas. Debería considerar usar el patrón Singleton o Monostate.

0

Si lo hace derecho, no será un problema. Si lo hace incorrecto, tiene la fuerza potencial de acceso secuencial al recurso.

A veces la diferencia entre lo correcto y lo incorrecto puede ser muy sutil y difícil de detectar, pero lo principal es que ningún método debe depender o bloquear ningún "estado" (miembros) de la clase.

0

Uso el método estático para objetos de búsqueda. Puedo administrar todos los objetos de búsqueda en un solo lugar (usando el almacenamiento en caché) para la aplicación asp.net y todos los métodos lo llaman usando el método estático.

De esta manera, no necesito crear instancias de objetos de búsqueda cada vez que lo necesito y esto reduce la necesidad de llamar a DB para mejorar el rendimiento.

Cuestiones relacionadas