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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top