c# asp.net asp.net-mvc ihttphandler system.web

c# - ¿Para qué sirve IHttpHandler.IsReusable?



asp.net asp.net-mvc (3)

Aparentemente, esto mantiene el controlador en la memoria y es capaz de manejar múltiples solicitudes. Cuando se establece en falso, tiene que crear una nueva instancia del controlador para cada solicitud entrante.

Aquí hay una pregunta que muestra lo que sucede cuando no se usa correctamente:

Transmisión de imágenes basadas en datos utilizando HttpHandler

Estoy escribiendo un IHttpHandler y tendré que implementar una propiedad IsReusable . Cuando miro la documentación de MSDN dice:

Obtiene un valor que indica si otra solicitud puede usar la instancia de IHttpHandler.

Esto no es muy útil. ¿En qué situaciones debo usar un controlador reutilizable y en qué situaciones no debería ser reutilizable?

Preguntas de seguimiento:

  1. ¿Qué es la reutilización?
  2. ¿Puedo mantener el estado (es decir, las variables de clase) cuando Reusable = true ?

Es más barato reciclar el controlador que a uno nuevo cada vez que se recibe una solicitud y el servidor mezcla menos memoria, lo que facilita el trabajo que GC debe realizar. Si el controlador se encuentra en un estado en el que lidiar con una nueva solicitud no sería problemático (es decir, cualquier estado en la instancia del controlador se ha restablecido) , entonces debería calificar como reutilizable.

EDITAR

No estoy seguro de si mi respuesta define correctamente qué es la reutilización. De hecho, permite la reutilización concurrente, por lo que sería mejor evitar el estado eficaz o administrarlo cuidadosamente de manera segura.


Esta propiedad indica si se pueden procesar múltiples solicitudes con la misma instancia de IHttpHandler. De forma predeterminada, al final de una interconexión de solicitud, todos los manejadores de http colocados en el handlerRecycleList de HttpApplication se establecen en nulo. Si un controlador es reutilizable, no se establecerá en nulo y la instancia se reutilizará en la próxima solicitud.

La ganancia principal es el rendimiento porque habrá menos objetos para recolectar basura.
El punto más importante para el controlador reutilizable es que debe ser seguro para subprocesos. Esto no es trivial y requiere un poco de esfuerzo.

Personalmente, sugiero que deje el comportamiento predeterminado (no reutilizable) si usa solo recursos administrados porque el recolector de basura debería manejarlos fácilmente. La ganancia de rendimiento de los manipuladores reutilizables suele ser insignificante en comparación con el riesgo de introducir errores de enhebrado difíciles de encontrar.

Si decide reutilizar el controlador, debe evitar mantener el estado en las variables de clase, ya que si se accede a la instancia del controlador al mismo tiempo, múltiples solicitudes escribirán / leerán los valores.