2009-07-28 19 views

Respuesta

8

Hecho por usted. Mire UnloadRecursive() desde System.Web.UI.Control en Reflector, que se llama por ProcessRequestCleanup().

+0

Thx Duncan, esa es la primera evidencia real que he visto. –

5

No, no debe llamar a Dispose on controls, eso se está haciendo. Usted es responsable de otros objetos desechables que cree fuera de la estructura de Control (FileStreams, etc.).

Esto se desprende de un principio general de .NET: la página es el propietario de los controles y, por lo tanto, se requiere que se filtre el (explícito) Dispose a ellos. Para el código real, deberá Reflector el código para Web.UI.Control.

+0

No dudo de que estés en lo cierto. Estoy tratando de convencer a alguien más y agradecería cualquier referencia que puedas saber que respalde esto. –

+0

Creo que la mejor evidencia en este caso es la falta de artículos sobre cómo limpiar los controles (-: Pero voy a editar un poco. –

+0

Henk está en lo correcto. Ni usted ni "otra persona" han visto ningún artículo de Microsoft en ASP.NET que tiene un "lazo de eliminación". Esto se debe a que no es necesario. –

2

Este artículo sobre The ASP.NET Page Life Cycle establece que:

"Unload se llama después de que la página ha sido totalmente rendido, se envía al cliente, y está listo para ser descartado En este punto, las propiedades de página como respuesta y solicitud. se descargan y se realiza cualquier limpieza ".

Me gustaría decir que "cualquier limpieza" significa eliminación de controles, etc. No puedo imaginarme que los diseñadores del framework ASP.NET habrían pasado por alto eso y nadie se habría dado cuenta.

1

Interpretado de manera diferente, hay más complejidad en esta pregunta de lo que parece.

Sure Disposed se llama, pero ¿hace algo? Depende.

Si se ha suscrito al evento Disposed de una página o control y espera que se llame por solicitud, es posible que se sorprenda. Sí, técnicamente hablando ProcessRequestCleanup() lo llama para usted, pero echar un vistazo a lo que realmente llama:

public virtual void Dispose() 
{ 
    IContainer service = null; 
    if (this.Site != null) 
    { 
     service = (IContainer) this.Site.GetService(typeof(IContainer)); 
     if (service != null) 
     { 
      service.Remove(this); 
      EventHandler handler = this.Events[EventDisposed] as EventHandler; 
      if (handler != null) 
      { 
       handler(this, EventArgs.Empty); 
      } 
     } 
    } 
    if (this._occasionalFields != null) 
    { 
     this._occasionalFields.Dispose(); 
    } 
} 

Sin una superficie de diseño, este código hace prácticamente nada en tiempo de ejecución, es decir, sus Disposed manipuladores nunca se ejecutarán.

La lección es no confiar en los controladores Disposed para ejecutar por solicitud. Puede anularlo para garantizar que se ejecuta algo, pero Unloaded es una apuesta mucho más segura.

Cuestiones relacionadas