tutorial - web forms c#
¿Por qué es necesario un método Dispose() explícito en los Controladores MVC de asp.net? ¿Alguien puede explicar sus complejidades?(Asp.net específico) (1)
Sé que C # puede administrar los recursos bastante bien con su recolector de basura. Pero como tiene eso, ¿para qué es exactamente esto y por qué se necesita?
¿Alguien puede explicar por qué se necesita .Dispose()
en asp.net mvc?
Además, ¿qué significa disponer de una conexión? ¿Por qué es necesario? Alguien sabe las complejidades de por qué es importante disponer de una conexión de base de datos como en db.Dispose()
? ¿Está esto relacionado con EF, o relacionado con SQL Server? Estoy tratando de entender exactamente por qué.
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
Dispose
es para liberar recursos "no administrados" (por ejemplo, sockets, manejadores de archivos, manejadores de mapas de bits, etc.), y si se llama fuera de un finalizador (eso es lo que significa el indicador de disposing
, BTW), para eliminar otros objetos IDisposibles que tienen. Ya no son útiles.
Los recursos "no administrados" no son administrados por el CLR (de ahí el nombre), y GC no se mete con ellos ni los libera por sí solo; A falta de un método de Dispose
(y el código que realmente lo usa), dependerá del finalizador del objeto para limpiarlo. Finalmente, el finalizador se ejecutará (si la aplicación está en buen estado y el objeto tiene un finalizador), y si el finalizador hace su trabajo, entonces todo está bien, pero tomará su tiempo dulce para hacerlo. Queda sin manijas mientras tanto, bueno. Demasiado malo para ese otro hilo / proceso / lo que sea que los necesiten.
Sin embargo, si dispone, los recursos se liberan de inmediato y todo funciona mejor.
(Por cierto, esto no está restringido a EF, SQL Server o cualquier otra tecnología. El patrón Desechable se encuentra en todo el marco .net, y se considera una buena práctica aprovecharlo cada vez que tenga una IDisponible que ya no está disponible. usado.)
En cuanto a por qué IDisposable
está implementado hasta ahora en el árbol, en lugar de solo implementarlo caso por caso ... no estoy 100% seguro. Pero imagina que estabas escribiendo un framework. Tenga en cuenta que si todo no fuera un IDisponible, tendría que verificarlo, ¡cada vez que quisiera deshacerse de algo! - si el objeto es desechable, y Dispose
si es así. Sin embargo, si implementa IDisposable "por si acaso", las cosas se simplifican, siempre se desecha. (Si un objeto no tiene nada que limpiar, simplemente no anula a Dispose
, en cuyo caso el Dispose
su padre recibe una llamada y realiza la limpieza que tiene que hacer, lo que puede ser nada también ...) Y es un caso suficientemente común para que los controladores tengan cosas que limpiar, que incluso si esa no es la verdadera razón, tiene mucho sentido hacer de todos modos.