Turn on more accessible mode
Skip Ribbon Commands
Skip to main content
Turn on Animations

Dispose o no Dispose, esa es la cuestión

Codigo


Cuando se usa el Modelo de Objetos de SharePoint para realizar alguna tarea, es necesario crear objetos SPWeb y SPSite con frecuencia. Pero no siempre se debe liberar el objeto de nuevo con el método "Dispose"
Autor: Gustavo

Cuando se crean gran cantidad de objetos del tipo SPWeb y/o SPSite en un aplicación para SharePoint (una WebPart, por ejemplo), se corre el riesgo de que el uso de memoria interna de los servidores aumente espectacularmente, con la consecuencia de una pérdida de respuesta y aumento de los tiempos de respuesta.

Asegurándose de que las referencias a SPWeb y/o SPSite sean anuladas con una llamada al respectivo método "Dispose", se libera la memoria utilizada, y el sistema permanece funcionando de la forma indicada. Por ejemplo:

SPSite myColeccionDeSitios = new SPSite("http://UnServidor");
//Aquí es donde ocurren las cosas interesantes
myColeccionDeSitios.Dispose(); //Libera la memoria usada
//o usando Close() se consigue el mismo efecto
myColeccionDeSitios.Close(); //Libera la memoria usada

o usando el estamento "using" no es necesario utilizar "Dispose" o "Close"

using(SPSite myColeccionDeSitios = new SPSite("http://UnServidor")
{
   //De nuevo algo interesante
}

Excepción muy importante aquí es que si se crea la referencia utilizando el método "GetContextWeb" o "GetContextSite", NO se debe usar "Dispose" o "Close", porque este método usa un recurso compartido de SharePoint, como indica el articulo de Microsoft "You receive an access violation error message when you call the Dispose method or the Close method to close an SPSite object or an SPWeb object in SharePoint Portal Server 2003 and in Windows SharePoint Services"