Importancia de bool IsReusable en la interfaz del controlador http

Respuestas:

152

El punto de entrada normal para un controlador es el método ProcessRequest. Sin embargo, puede tener código en el constructor de la clase que reúne algunos valores de instancia que son caros de construir.

Si especifica Reusable como verdadero, la aplicación puede almacenar en caché la instancia y reutilizarla en otra solicitud simplemente llamando a su método ProcessRequest una y otra vez, sin tener que reconstruirlo cada vez.

La aplicación instanciará tantos manejadores como sean necesarios para manejar la carga actual.

La desventaja es que si el número de instancias necesarias es mayor que las instancias actualmente presentes, causan que se use más memoria. Por el contrario, también pueden reducir los usos aparentes de la memoria, ya que su valor de instancia sobrevivirá a los ciclos de GC y no es necesario reasignarlos con frecuencia.

Otra advertencia es que debe asegurarse de que al final de la ejecución de ProcessRequest el estado del objeto sea el que desea para que otra solicitud reutilice el objeto.

AnthonyWJones
fuente
2
Usted menciona la reutilización de objetos como la optimización clave lograda al especificar IsReusable = True. Si se configura IsReusable = False, el servidor no creará instancias múltiples del controlador. IE: ¿elimina las solicitudes concurrentes?
Ian
@Ian Creo que funciona como una página normal cuando reutilizable es falso, aunque puedo estar equivocado. Cuando es reutilizable, puede manejar 6 solicitudes simultáneas con 2 o 3 instancias (solo ejemplo), mientras que cuando no es reutilizable necesitaría instancias / procesos 1: 1. No puedo imaginar que .Net permita que las solicitudes se acumulen ya que 1 subproceso de trabajo intentó manejarlo todo mientras actualiza / reinicia continuamente su estado.
DavidScherer
47

Con la respuesta de AnthonyWJones, si sus declaraciones de controlador HTTP truepara IsReusableentonces usted debe asegurarse de que está totalmente seguro para subprocesos.

No hay nada en la documentación que indique que los controladores reutilizables no se pueden reutilizar simultáneamente, aunque las implementaciones actuales de Microsoft solo parecen reutilizarlos consecutivamente. Pero, al menos en teoría, una sola instancia de controlador podría ser reutilizada simultáneamente por múltiples solicitudes, por lo que no debe confiar en ningún dato que pueda ser modificado por otros hilos concurrentes.

LukeH
fuente
Perdón por ser pesado, pero ¿alguien podría explicar qué se entiende por "cambio de contexto"? Si accede a cosas desde el sesson o la cadena de consulta (content.Request.QueryString), ¿eso es reutilizable o no?
zod
55
El cambio de contexto es cuando una CPU deja de procesar en un hilo y comienza a procesar en otro. Es decir, la CPU cambió su contexto de un hilo a otro. Esto sucede constantemente en las PC, nos dio la ilusión de realizar múltiples tareas antes de que hubiera computadoras multinúcleo.
Larry Dukek
No pude entender cuándo dijiste que podría haber un cambio de contexto en cualquier momento . Cuando escribimos url y presionamos enter, esto ejecuta una solicitud a la vez. Derecha ?
El cambio de contexto será un problema cuando varios usuarios estén usando una aplicación al mismo tiempo. Por ejemplo, si dos usuarios desean actualizar el mismo registro al mismo tiempo, el cambio de contexto podría causar problemas.
Ishmael Smyrnow
77
Esta declaración sobre la IsReusableexigencia de seguridad del hilo parece estar en contradicción con la respuesta de AnthonyWJones. Según entiendo su tercer párrafo (La aplicación creará una instancia de tantos de ...), una instancia de controlador reutilizable no se reutilizará simultáneamente, sino solo después de haber finalizado su procesamiento actual. Si esto es cierto, entonces no hay necesidad de ser seguro para subprocesos.
Frédéric
3

Si no almacena ningún estado en esa instancia (es decir, no tiene ningún campo (también conocido como "variables de clase")) entonces debería estar seguro de reutilizarlo.

Por defecto, es falso estar del lado seguro.

Andrei Rînea
fuente