SharePoint SPSite Eliminação
-
06-07-2019 - |
Pergunta
O cenário que eu tenho, é o método de Execução de um SPJobDefinition eu quero passar todos os SPSite no aplicativo da web.Então, eu tenho o seguinte código:
foreach (SPSite site in this.WebApplication.Sites)
{
...
}
A pergunta é, eu preciso dispor de cada site?A regra que eu normalmente seguir é de eliminar ou colocar dentro de uma utilizando apenas se eu de novo-lo até mim.Será que os Sites de propriedade, na verdade, conter totalmente construído site de objetos para começar com o que eu vou só tem uma referência a este código.Se assim for, em seguida, eliminar a sites seria perigoso como eu estou modificando outro objeto que possa desejar.Ou o oposto é a propriedade de Sites construção de objetos a pedido..que no caso é o meu responcibility para eliminá-los?
E como devo descartá-los, se eu preciso fazer isso.Eu não posso usar um usando neste caso, e vai chamar um descarte dentro do foreach quebrar a enumeração?
Solução
Sim você faz. Consulte "Escrevendo aplicativos que escalam para um grande número de usuários" em Melhores práticas: problemas comuns de codificação ao usar o modelo de objeto do SharePoint. O padrão correto é:
foreach (SPSite site in this.WebApplication.Sites)
{
try
{
...
}
finally
{
site.Dispose();
}
}
Chamular Dispo não quebrará a enumeração. Ele apenas limpa a memória não gerenciada usada pelo objeto.
Outras dicas
A orientação aquihttp://www.sharepointdevwiki.com/display/public/when+to+dispose+sharePoint+Objects
sugere que
//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
using (SPWeb subweb = rootweb.Webs[i])
{
//do stuff
}
}
é a solução preferida para esse problema.
Há também uma ferramenta que você pode executar sua solução para verificar se está fazendo as coisas corretamente.http://code.msdn.microsoft.com/spdisposecheck