Eliminación de SharePoint SPSite
-
06-07-2019 - |
Pregunta
El escenario que tengo está en el método Ejecutar de una SPJobDefinition que quiero revisar en cada SPSite de la aplicación web. Entonces tengo el siguiente código:
foreach (SPSite site in this.WebApplication.Sites)
{
...
}
La pregunta es, ¿necesito deshacerme de cada sitio? La regla que normalmente sigo es desechar o poner dentro de un uso solo si lo cambio yo mismo. ¿Será que la propiedad de Sitios realmente contiene objetos de sitio completamente construidos para comenzar, a los que solo haré referencia en este código? Si es así, deshacerse de los sitios sería peligroso ya que estoy modificando otro objeto que podría quererlos. O al contrario, ¿la propiedad de Sitios construye los objetos a pedido ... en cuyo caso es mi responsabilidad deshacerme de ellos?
Además, ¿cómo los elimino si necesito hacer eso? No puedo usar un uso en este caso, y ¿llamar a una disposición dentro del foreach romperá la enumeración?
Solución
Sí, lo haces. Consulte "Escritura de aplicaciones que se adaptan a grandes cantidades de usuarios". en Mejores prácticas: problemas comunes de codificación al usar el modelo de objetos de SharePoint . El patrón correcto es:
foreach (SPSite site in this.WebApplication.Sites)
{
try
{
...
}
finally
{
site.Dispose();
}
}
Llamar a dispose no interrumpirá la enumeración. Simplemente limpia la memoria no administrada utilizada por el objeto.
Otros consejos
La guía aquí http://www.sharepointdevwiki.com/display/public/ Cuando + a + Eliminar + SharePoint + objetos
sugiere que
//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
using (SPWeb subweb = rootweb.Webs[i])
{
//do stuff
}
}
es la solución preferida para este problema.
También hay una herramienta que puede ejecutar sobre su solución para verificar que está haciendo las cosas bien. http://code.msdn.microsoft.com/SPDisposeCheck