Question

Le scénario que j'ai est dans la méthode Execute d'un SPJobDefinition. Je souhaite parcourir tous les sites SPSite de l'application Web. J'ai donc le code suivant:

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

La question est la suivante: dois-je disposer de chaque site? La règle par laquelle je passe normalement est de disposer ou de mettre dans un usage seulement si je le fais moi-même. Est-ce que la propriété Sites contiendra en fait des objets de site entièrement construits pour commencer, auxquels je ne ferai référence que dans ce code. Dans ce cas, il serait dangereux de supprimer les sites, car je modifie un autre objet susceptible de les vouloir. Ou bien au contraire, la propriété Sites construit-elle les objets à la demande? Dans ce cas, est-ce ma responsabilité de les éliminer?

De plus, comment puis-je en disposer si j'ai besoin de le faire? Je ne peux pas utiliser a using dans ce cas, et est-ce que le fait d'appeler un dispose à l'intérieur de foreach annulera l'énumération?

Était-ce utile?

La solution

Oui vous le faites. Reportez-vous à la section "Ecriture d'applications pouvant s'adapter à un grand nombre d'utilisateurs". Meilleures pratiques: problèmes de codage courants lors de l'utilisation du modèle d'objet SharePoint . Le modèle correct est:

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

L'appel de disposition n'interrompra pas l'énumération. Il nettoie simplement la mémoire non gérée utilisée par l’objet.

Autres conseils

Les conseils ici http://www.sharepointdevwiki.com/display/public/ Quand + pour + éliminer + les objets SharePoint +

suggère que

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

est la solution préférée à ce problème.

Il existe également un outil que vous pouvez utiliser dans votre solution pour vérifier que vous faites les choses correctement. http://code.msdn.microsoft.com/SPDisposeCheck

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top