2009-07-09 22 views
6

Sospecho que esto también se aplica a ASP.Net general, pero no estoy seguro.Seguridad de subprocesos en ASP.Net MVC

Si tengo un método de acción en un controlador, diga MyController.DoSomethingExciting y tres clientes lo presionen al mismo tiempo, es intrínsecamente seguro para subprocesos, o tengo que hacer algo para asegurar que las tres llamadas simultáneas no interactúan entre ellos?

Respuesta

13

Las variables locales en ese método serán por llamada. Supongo (no conozco MVC) que las instancias del Controlador son por solicitud, por lo que cualquier miembro de la instancia estaría a salvo.

Pero si hay miembros estáticos u otros miembros compartidos, entonces no son seguros.

+2

Tiene la razón de que las instancias del Controlador son por solicitud – roryf

+0

¿Hay una instancia de controlador por solicitud que la haga segura? ¿O hay una forma en que una instancia de un controlador podría ser utilizada por múltiples hilos en la misma solicitud? Quiero asegurarme de que si le doy a mi controlador una variable privada, es seguro para subprocesos. – xr280xr

+1

Un miembro de instancia de una instancia de controlador debería ser seguro para subprocesos, hasta donde yo sé. Pero asegúrese de que todos los recursos que utiliza el controlador sean realmente seguros para subprocesos. De nuevo, nótese que no sé que la instancia del controlador es por solicitud. –

2

si el método ejemplifica todas sus propias variables y no utiliza ningún miembro estático, entonces debería estar bien en todos los casos.

Si varios subprocesos hacen referencia al objeto a la vez y lee algunas variables de nivel de clase varias veces que podrían ser modificadas por otro subproceso entre las lecturas, podría haber un problema.

Si solo lee datos una vez y no escribe nada en el nivel de clase, es probable que no sea un problema el multi-threading.

2

No necesariamente. Depende de lo que quiere decir con "seguridad de hilo".

Supongamos, por ejemplo, que comparten un Entity Framework, digamos "db", y funcionan en alguna tabla. ya que llamó a su controlador "MyController", llame a este db.MyTable Cada solicitud invoca una instancia diferente de MyController. Hasta el momento, hilo de seguridad. Cada controlador crea una instancia de MyEntities db = new MyEntities(); Hasta ahora, seguro. pero como db.MyTable es del tipo IEnumerable <MyTable>, interactúan entre sí. Supongamos que trabajan en la misma entidad en la base de datos (sin bloqueos), digamos db.MyTable [0]: se sobrescribirán entre sí ("el último para guardar las ganancias").

3 usuarios de su sitio tendrán tres punteros independientes (en la pila) apuntando al mismo lugar (en la base de datos). No es un problema de hilo. Es un problema de bloqueo de datos.

+1

@ colin-desmond Pregúntese: ¿pueden dos personas en mi sistema usar el mismo recurso (como la misma entidad de datos) y tratar de escribirlo (actualizar) juntos? – LongChalk

Cuestiones relacionadas