如果您启动SharePoint并了解如何部署SPSite和SPWeb,那么如果您使用SPSite和SPWeb的新实例,几乎所有人都建议使用“using”-construct。
using (SPSite s = new SPSite("http://yourserver")
{
using (SPWeb web = s.OpenWeb("http://yourweb")
{
// do fancy stuff here
}
}
我也这样做了。但是,如果查看 SPSite.Dispose()方法,您会注意到SPSite保留了由 SPSite.OpenWeb()创建的SPWebs的引用。在 SPSite.Dispose()上,所有与此SPSite绑定的SPWeb都被放置。我认为(但我不确定)几乎所有创建新SPWeb的方法都是将此SPWeb添加到内部集合'm_openedWebs'。
这就是说,我想知道你为什么要处置一个SPWeb对象?您是否应该处置SPWeb对象?
更新
我刚才意识到,我饶了一些可能很重要的细节。 SPSite对象不会在其子SPWebs上调用 Dispose(),但它正在调用 Close()。在当前的SharePoint实现中,这与 Dispose()相同,因为 SPWeb.Dispose()只包含:
public void Dispose()
{
this.Close();
}
因此,处理SPWeb对象的一个原因可能是与未来的SharePoint实现兼容,其中 SPWeb.Dispose()不仅调用 SPWeb.Close()。我仍然觉得仅仅因为这个原因“双重处理”我的SPWebs是不合适的。
答案 0 :(得分:2)
你是对的,处理SPSite
会关闭相关的SPWeb
个对象。
您希望立即关闭SPWeb的主要方案是执行以下操作:
foreach (SPWeb web in site.AllWebs)
{
// do something with the web object
web.dispose(); // <-- this is mandatory!
}
对于一个SPSite / SPWeb的正常打开和关闭,这没关系,但我认为这仍然是一个好习惯(特别是对于新的SharePoint开发人员)。
如果你还没有,我强烈推荐阅读StefanGoßner的帖子:http://blogs.technet.com/b/stefan_gossner/archive/2008/12/05/disposing-spweb-and-spsite-objects.aspx
答案 1 :(得分:0)
这是一个有趣的困境,binford和我当然不知道直到现在SPSite对象是不可能处置任何绑定它的SPWebs。
如果您说的是这样,那么我认为您可能仍然希望显式处理SPWeb的唯一原因可能是当场景更复杂时,例如使用两个或更多SPWebs,其中构建时间和因此,破坏它们成为一个更重要的考虑因素。
例如,假设您在SPSite使用块内部有7个SPWeb实例,每个实例在执行之前执行一系列长时间运行和复杂的操作 - 您希望尽快关闭并处理这些对象最大化内存资源和垃圾收集。
那就是说,在最基本的情况下(1 SPSite,1 SPWeb,如上所述),我开始怀疑SPWeb显式处置是否有必要。
我认为需要更多的研究和意见,但感谢您提醒我注意这一点。
答案 2 :(得分:0)
如果您正在SPSite中实例化的多个SPWebs中读取/写入数据,并且您无法控制已打开的数据,则很快就会遇到数据并发问题,您需要在整个过程中执行AllowUnSafeUpdates这通常是不好的做法。
Chris O'Brien在SPWeb和IDisposable上有一篇很好的博客文章: http://www.sharepointnutsandbolts.com/2008/06/disposing-sharepoint-objects-what-they.html
答案 3 :(得分:0)
我会确保您使用SPDisposeCheck。在Visual Studio之后,这是 必须 拥有SharePoint开发工具。最新版本现在包含有关何时不处置对象的规则:
我们已经在“NOT”处于内部添加由SharePoint实例化的对象时添加了几项检查。这些新报告的“DO NO DISPOSE”(DND)规则未被SPDisposeCheck v1.3报告。*。