博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SPSite和SPWeb的DisPose()方法研究

Posted on 2011-06-04 13:36  _重剑无锋  阅读(371)  评论(0)    收藏  举报

对SPSite和SPWeb对象使用Dispose()方法,主要有4个方面需要注意:

1.确保你Dispose的SPSite和SPWeb对象,是你自己代码创建出来的。

下面的几种情况是不需要释放的,如果释放这些对象,可能会引起异常。

  •  SPContext.Current.Web
  •    SPContext.Current.Site
  •    SPContext.Current.Site.RootWeb
  •    SPFeatureReceiverProperties.Feature.Parent for a Site- or Web-scoped feature receiver
  •    SPWebEventProperties.Web
  •    SPListEventProperties.Web
  •    SPListEventProperties.List.Web
  •    SPItemEventProperties.ListItem.Web
  •    UnsecuredLayoutsPage.Web (and LayoutsPageBase.Web)
  •    SPWebProvisioningProperties.Web
  •    SPControl.GetContextWeb()
  •    SPControl.GetContextSite()

总的来说,下面三种情况,必须释放SPSite或者SPWeb对象:

  • 新New出来的SPSite对象:

   SPSite site = new SPSite(url);

  • 显示的调用SPSite.OpenWeb()方法:
    SPWeb web = site.OpenWeb(url);
  • 使用SPSite.AllWebs ---这是个特别耗费资源的操作,尽量避免使用该对象:

  foreach(SPWeb web in site.AllWebs)

  {
    // …
    web.Dispose();
  }

2.一个SPSite或SPWeb对象,如果你不再使用它,应该尽快尽快释放掉。

也就是说,在最后一次访问它们的子对象之后,应该立即释放它们。需要注意的是,这里的SPWeb对象的SubSite,并不是SPWeb的子对象,SPWeb的子对象是指它的SPlist、SPFolder或SPListItem对象。

3.使用已经被释放的SPWeb或SPSite对象将会引起异常。(这种情况通常出现于,你Dispose掉一个不是你创建的SPWeb或SPSite对象)

合理的使用Dispose()方法是非常重要的,因为不合理的Dispose()是非常危险的。当你不能确认是否应该释放该对象时,我的观点是,宁可谨慎一点也不要乱用Dispose方法,让SharePoint来清理这些对象。对于SPWeb对象,当它的Parent Site被释放时,它也被释放。对于SPSite对象,当线程结束时会被清理。