SharePoint SPSite处置

时间:2009-06-17 16:13:54

标签: c# sharepoint dispose spsite

我所拥有的场景是SPJobDefinition的Execute方法我想浏览Web应用程序中的每个SPSite。所以我有以下代码:

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

问题是,我是否需要处理每个网站?我通常会遵循的规则只有在我自己新建的情况下才会处理或放入使用中。该Sites属性是否实际上包含完全构造的站点对象,我将在此代码中仅引用该对象。如果是这样,那么处理网站将是危险的,因为我正在修改另一个可能需要它们的对象。或者相反的是,Sites属性是根据请求构造对象的......在这种情况下,我处理它们的可行性是什么?

另外,如果我确实需要这样做,我该怎么处理它们。在这种情况下我不能使用using,并且会在foreach中调用一个dispose来打破枚举吗?

3 个答案:

答案 0 :(得分:15)

是的,你这样做。请参阅Best Practices: Common Coding Issues When Using the SharePoint Object Model中的“编写可扩展到大量用户的应用程序”。正确的模式是:

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

调用dispose不会破坏枚举。它只是清理对象使用的非托管内存。

答案 1 :(得分:0)

这里的指导 http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects

建议

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

是此问题的首选解决方案。

还有一个工具可以运行在您的解决方案上,以检查您是否正确行事。 http://code.msdn.microsoft.com/SPDisposeCheck

答案 2 :(得分:0)