Domanda

Lo scenario che ho, è nel metodo Execute di una SPJobDefinition che voglio passare attraverso ogni SPSite nell'applicazione web. Quindi ho il seguente codice:

foreach (SPSite site in this.WebApplication.Sites)
{
  ...
}

La domanda è: devo smaltire ogni sito? La regola che seguo normalmente è smaltire o mettere dentro un uso solo se lo rinnovo da solo. La proprietà di Sites in realtà conterrà oggetti sito completamente costruiti per cominciare con i quali avrò solo un riferimento in questo codice. In tal caso, lo smaltimento dei siti sarebbe pericoloso poiché sto modificando un altro oggetto che potrebbe volerli. O il contrario è che la proprietà Sites costruisce gli oggetti su richiesta ... in che caso è mia responsabilità smaltirli?

Inoltre, come posso eliminarli se devo farlo. Non posso usare un utilizzo in questo caso e chiamare un dispose all'interno del foreach interromperà l'enumerazione?

È stato utile?

Soluzione

Sì, sì. Vedi " Scrivere applicazioni che si adattano a un gran numero di utenti " in Best practice: problemi di codifica comuni quando si utilizza il modello a oggetti di SharePoint . Il modello corretto è:

foreach (SPSite site in this.WebApplication.Sites)
{
  try
  {
    ...
  }
  finally
  {
    site.Dispose();
  }
}

La chiamata a dispose non interromperà l'enumerazione. Pulisce semplicemente la memoria non gestita utilizzata dall'oggetto.

Altri suggerimenti

La guida qui http://www.sharepointdevwiki.com/display/public/ quando + per + Smaltire + SharePoint + oggetti

suggerisce che

//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
  using (SPWeb subweb = rootweb.Webs[i])
  {
    //do stuff
  }
}

è la soluzione preferita a questo problema.

Esiste anche uno strumento che è possibile eseguire sulla soluzione per verificare che si stiano facendo le cose nel modo giusto. http://code.msdn.microsoft.com/SPDisposeCheck

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top