Smaltimento di SharePoint SPSite
-
06-07-2019 - |
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?
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