Frage

Das Szenario, das ich habe, ist in der Execute-Methode einer SPJobDefinition, ich möchte jede SPSite in der Webanwendung durchgehen.Also ich habe den folgenden Code:

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

Die Frage ist: Muss ich jede Site entsorgen?Die Regel, nach der ich mich normalerweise wende, ist, sie nur dann zu entsorgen oder in einen Gebrauch zu geben, wenn ich sie selbst neu in Betrieb nehme.Wird diese Sites-Eigenschaft tatsächlich zunächst vollständig erstellte Site-Objekte enthalten, auf die ich in diesem Code nur verweisen werde?Wenn ja, wäre es gefährlich, die Sites zu entsorgen, da ich ein anderes Objekt ändere, das sie möglicherweise haben möchte.Oder im Gegenteil: Konstruiert die Sites-Eigenschaft die Objekte auf Anfrage?In welchem ​​Fall liegt es in meiner Verantwortung, sie zu entsorgen?

Und wie entsorge ich sie, wenn ich das tun muss?Ich kann in diesem Fall kein using verwenden, und wird der Aufruf eines dispose innerhalb von foreach die Aufzählung unterbrechen?

War es hilfreich?

Lösung

Ja, das tust du.Siehe „Anwendungen schreiben, die für eine große Anzahl von Benutzern skalierbar sind“ in Empfohlene Vorgehensweise:Häufige Codierungsprobleme bei der Verwendung des SharePoint-Objektmodells.Das richtige Muster ist:

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

Durch den Aufruf von dispose wird die Aufzählung nicht unterbrochen.Es bereinigt lediglich den nicht verwalteten Speicher, der vom Objekt verwendet wird.

Andere Tipps

Die Anleitung hierhttp://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects

schlägt vor, dass

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

ist die bevorzugte Lösung für dieses Problem.

Es gibt auch ein Tool, mit dem Sie Ihre Lösung überprüfen können, um zu überprüfen, ob Sie alles richtig machen.http://code.msdn.microsoft.com/SPDisposeCheck

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top