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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top