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.
Thx Duncan, esa es la primera evidencia real que he visto. –