SPSite和SPWeb的DisPose()方法研究
时间:2011-06-04 来源:howTo
对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对象,当线程结束时会被清理。
相关阅读 更多 +