En mi aplicación, tengo un método estático que se llama desde varios subprocesos al mismo tiempo. ¿Existe algún peligro de que se confundan mis datos?
En mi primer intento, el método no era estático y estaba creando varias instancias de la clase. En ese caso, mis datos se mezclaron de alguna manera. No estoy seguro de cómo sucede esto porque solo sucede a veces. Todavía estoy depurando. Pero ahora el método es estático y no tengo problemas hasta ahora. Quizás sea solo suerte. No estoy seguro.
c#
multithreading
static
TalkingCode
fuente
fuente
Respuestas:
Las variables declaradas dentro de los métodos (con la posible excepción de las variables " capturadas ") están aisladas, por lo que no obtendrá ningún problema inherente; sin embargo, si su método estático accede a cualquier estado compartido, todas las apuestas están canceladas.
Ejemplos de estado compartido serían:
Si tiene un estado compartido, debe:
whatever.SomeData
repetidamente, leewhatever.SomeData
una vez en una variable local, y luego solo use la variable, tenga en cuenta que esto solo ayuda para el estado inmutable)fuente
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 se confundan los datos. 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 muy probable que los datos no estén realmente separados.
fuente
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Solo para agregar, las variables locales declaradas dentro del alcance de un método estático no forman esa parte de los datos por la que debemos preocuparnos en el escenario dado.Los métodos estáticos deberían estar bien para varios subprocesos.
Por otro lado, los datos estáticos podrían causar un problema porque los intentos de acceder a los mismos datos desde diferentes subprocesos deben controlarse para garantizar que solo un subproceso a la vez esté leyendo o escribiendo los datos.
fuente
MSDN siempre dice:
Editar: Como dicen los chicos aquí, 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.
fuente