C #: ¿Qué sucede si se llama a un método estático desde múltiples hilos?

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?

En mi primer bash, 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

Las variables declaradas dentro de los métodos (con la posible excepción de las variables ” capturadas “) 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 a los que se accede desde un caché común (no serializado)
  • datos obtenidos a través de los parámetros de entrada (y estado en esos objetos), si es posible que múltiples hilos toquen el mismo objeto (s)

Si ha compartido estado, debe hacer lo siguiente:

  • tenga cuidado de no modificar el estado una vez que se pueda compartir (mejor: utilice objetos inmutables para representar el estado y tome una instantánea del estado en una variable local, es decir, en lugar de referencia. whatever.SomeData repetidamente, lea whatever.SomeData que whatever.SomeData una vez una variable local, y luego simplemente use la variable – ¡tenga en cuenta que esto solo ayuda para el estado inmutable!)
  • sincronizar el acceso a los datos (todos los hilos deben sincronizarse) – ya sea mutuamente excluyente o (más granular) lector / escritor

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 hilo 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 mezclan, es más probable porque los datos no están realmente separados.

Los métodos estáticos deberían estar bien para múltiples hilos.

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

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 dicen aquí los chicos, no siempre es 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.