2010-06-14 12 views
75

En mi aplicación tengo un método estático que se llama desde múltiples hilos al mismo tiempo. ¿Hay algún peligro de que mis datos se mezclen?C#: ¿Qué ocurre si se llama a un método estático desde varios subprocesos?

En mi primer intento el método no era estático y estaba creando múltiples instancias de la clase. En ese caso mis datos se mezclaron de alguna manera. No estoy seguro de cómo sucede esto porque a veces solo sucede. Todavía estoy depurando. Pero ahora el método es estático, no tengo problemas hasta ahora. Quizás es solo suerte. No estoy seguro

Respuesta

74

Las variables declaradas dentro de los métodos (con la posible excepción de "capturadas" variables) están aisladas, por lo que no tendrá ningún problema inherente; sin embargo, si su método estático accede a cualquier estado compartido, todas las apuestas están desactivadas.

Ejemplos de-estado compartido serían:

  • campos estáticos
  • objetos que se accede desde una caché común (no serializada)
  • datos obtenidos a través de los parámetros de entrada (y el estado de los objetos) , si es posible que múltiples hilos estén en contacto con el mismo objeto (s)

Si usted ha compartido estado, usted debe:

  • tener cuidado de no para mutar el estado una vez que se puede compartir (mejor: usar objetos inmutables para representar el estado, y tomar una instantánea del estado en una variable local - es decir, en lugar de hacer referencia a whatever.SomeData en repetidas ocasiones, se lee whatever.SomeDatauna vez en una variable local, y luego simplemente use la variable - tenga en cuenta que esto solo ayuda para el estado inmutable!)
  • sincronice el acceso a los datos (todos los hilos deben sincronizarse) - ya sea mutuamente excluyentes o (más granulares) lector/escritor
+1

eche un vistazo a este http://msdn.microsoft.com/library/c5kehkcz(VS .80) .aspx –

+1

@Diego: ¿ese comentario es para mí o para @Holli? –

+0

Para Holli, solo para agregar algo de información práctica a su respuesta. –

9

Los métodos estáticos deberían ser adecuados para varios hilos.

Los datos estáticos por otro lado podrían causar un problema porque los intentos de acceder a los mismos datos de diferentes subprocesos deben controlarse para asegurarse de que solo un subproceso a la vez está leyendo o escribiendo los datos.

+0

La palabra clave aquí es la sincronización :-) –

+0

La lectura puede suceder simultáneamente, pero leer Y escribir al mismo tiempo dará lugar a un comportamiento inesperado – Freestyle076

4

MSDN Siempre dice:

Cualquier miembro público estático (compartido en Visual Basic) de este tipo es seguro para subprocesos. No se garantiza que ningún miembro de instancia sea seguro para subprocesos.

Editar: Como los chicos de aquí dicen, no es siempre el caso, y claramente esto se aplica a las clases diseñadas de esta manera en el BCL, no a las clases creadas por el usuario, donde esto no se aplica.

16

Sí, es solo suerte. ;)

No importa si el método es estático o no, lo que importa es si los datos son estáticos o no.

Si cada subproceso tiene su propia instancia separada de la clase con su propio conjunto de datos, no hay riesgo de que los datos se mezclen. Si los datos son estáticos, solo hay un conjunto de datos y todos los subprocesos comparten los mismos datos, por lo que no hay forma de no mezclarlos.

Cuando sus datos en instancias separadas todavía se confunden, es más probable porque los datos no están realmente separados.

Cuestiones relacionadas