4

我的场景是在 SPJobDefinition 的 Execute 方法中,我想遍历 Web 应用程序中的每个 SPSite。所以我有以下代码:

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

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

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

4

3 回答 3

15

是的你是。请参阅最佳实践:使用 SharePoint 对象模型时的常见编码问题中的“编写可扩展到大量用户的应用程序” 。正确的模式是:

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

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

于 2009-06-17T16:34:42.430 回答
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

于 2009-06-18T10:28:34.580 回答
0

看这里 -最佳实践:使用一次性 Windows SharePoint Services 对象

于 2009-06-25T23:20:24.147 回答