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