2009-06-17 96 views
4

我有這種情況是在SPJobDefinition的Execute方法中,我想要通過Web應用程序中的每個SPSite。所以我有以下代碼:SharePoint SPSite處置

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

問題是,我是否需要處理每個站點?我通常所遵循的規則只有在我自己創新的時候纔會被處置或放入使用中。該站點屬性是否實際上包含完全構建的站點對象,以便我只在此代碼中引用該對象。如果是這樣,那麼處置這些網站將是危險的,因爲我正在修改另一個可能需要它們的對象。或者相反,Sites屬性根據請求構造對象。在這種情況下,我是否有責任處理它們?

另外如果我確實需要這樣做,我該如何處理它們。在這種情況下,我不能使用一個使用方法,並且會在foreach中調用一個dispose來枚舉枚舉?

回答

15

是的。請參閱Best Practices: Common Coding Issues When Using the SharePoint Object Model中的「編寫可擴展到大量用戶的應用程序」。正確的模式是:

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

調用dispose不會中斷枚舉。它只是清理對象使用的非託管內存。

+0

我問它打破了枚舉,因爲我已經在那裏刪除一些東西你目前在枚舉在foreach拋出異常的名單有問題。我只是不知道這裏是否適用。有意義的是,如果我在WebApplication.Sites中創建一個網站的副本,然後將其配置爲不會修改枚舉在 – 2009-06-17 17:52:20

+0

上運行的集合我傾向於將此處置邏輯封裝到AsSafeEnumerable()擴展方法中:http:/ /solutionizing.net/2009/01/05/linq-for-spwebcollection-revisited-assafeenumerable/此方法包含在SPExLib中:http://spexlib.codeplex.com/ – dahlbyk 2009-09-22 16:28:26