2009-06-17 8 views
4

Das Szenario Ich habe, ist in der Execute-Methode eines SPJobDefinition ich durch jede SPSite in der Web-Anwendung zu gehen. So habe ich den folgenden Code:Sharepoint SPSite Entsorgung

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

Frage ist, muss ich von jedem Standort entsorgen? Die Regel, die ich normalerweise beziehe, ist zu entsorgen oder in eine Anwendung zu stecken, nur wenn ich sie selbst neu erstelle. Wird die Sites-Eigenschaft zu Beginn tatsächlich vollständig erstellte Site-Objekte enthalten, auf die ich in diesem Code nur einen Verweis habe. Wenn das der Fall ist, wäre das Entsorgen der Websites gefährlich, da ich ein anderes Objekt modifiziere, das sie vielleicht haben möchte. Oder das Gegenteil ist, erstellt die Sites-Eigenschaft die Objekte auf Anfrage. In welchem ​​Fall ist es meine Verantwortung, über sie zu verfügen?

plus, wie ich sie entsorgen, wenn ich das tun müssen, um tun. Ich kann eine Verwendung in diesem Fall nicht verwenden, und wird eine Aufzählung innerhalb der Foreach brechen die Aufzählung aufrufen?

Antwort

15

Ja, Sie tun. Siehe "Anwendungen schreiben, die auf eine große Anzahl von Benutzern skalieren" in Best Practices: Common Coding Issues When Using the SharePoint Object Model. Das richtige Muster lautet:

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

Aufruf von dispose wird die Aufzählung nicht unterbrechen. Es räumt nur den vom Objekt verwendeten nicht verwalteten Speicher auf.

+0

Ich fragte sie die Aufzählung zu brechen, weil ich Probleme habe, wo etwas aus einer Liste löschen Ihre derzeit mit einer foreach Aufzählen über eine Ausnahme auslöst. Ich wusste nur nicht, ob das hier auch zutrifft. Wenn ich eine Kopie der Site innerhalb von WebApplication.Sites mache, die die Sammlung, die die Enumeration ausführt, unter –

+0

nicht ändert, möchte ich diese Entsorgungslogik in eine AsSafeEnumerable() - Erweiterungsmethode einbetten: http://solutionizing.net/2009/01/05/linq-for-wspebcollection-revisited-assafeenumerable/ Diese Methode ist in SPExLib enthalten: http://spexlib.codeplex.com/ – dahlbyk

0

Die Führung hier http://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 
    } 
} 

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

Es gibt auch ein Werkzeug, das Sie über Ihre Lösung ausführen können Sie die Dinge richtig tun zu überprüfen. http://code.msdn.microsoft.com/SPDisposeCheck

+0

Link ist jetzt tot, so richtig Link ist http://web.archive.org/web/20100109154857/http://sharepointdevwiki.com/display/public/Wenn+Speicherziele + veröffentlichen –

Verwandte Themen