学习:使用SHAREPOINT对象模型开发时注意事项(转)


WSS中,微软提供了一整套完成的接口,使开发者可以通过这些接口对WSS中数据进行读写,那么,在编写代码过程中需要注意哪些问题呢?如何解决这些问题?

WSS对象模型包含对象都实现了IDisposable接口,所以必须注意尽量避免在内存中保留没用的对象。实际上,如果没有及时清除内存中没用的对象,可以能出现一些问题。
比如,WSS应用程序池经常性回收,应用程序出现堆栈错误,系统性能下降等等。那么如何防止这些问题发生,我们需要在代码中注意一些事项:

1. 使用Dispose方法来清除没用的对象

在WSS对象模型中,主要影响性能的类有SPSite类和SPWeb类,建议在使用完这些类后使用Dispose方法清空对象。这些内存中的对象在长时间没有使用的情况下,.net垃圾回收机制进行清理,但是,千万不要太过相信垃圾回收机制,可能在它回收这些对象之前,你的机器已经崩溃。。:funk:

2. 使用using语句
通过using语句,可以在对象不在使用范围内自动清空,这样防止忘记调用dispose方法。如:
using(SPSite oSPsite = new SPSite("http://server"))
{
  using(SPWeb oSPWeb = oSPSite.OpenWeb())
   {
       str = oSPWeb.Title;
       str = oSPWeb.Url;
   }
}  

3. 利用try,catch和finally代码块防止程序出错后对象遗留在内存中。

String str;
SPSite oSPSite = null;
SPWeb oSPWeb = null;
try
{
   oSPSite = new SPSite("http://server");
   oSPWeb = oSPSite.OpenWeb(..);

   str = oSPWeb.Title;
}
catch(Exception e)
{
}
finally
{
    //当程序出错后,会调用这里的代码清除对象   
   if (oSPWeb != null)   
     oSPWeb.Dispose();

   if (oSPSite != null)
      oSPSite.Dispose();
}

注意,在使用重定向后,将不会调用finally中的代码,所以,如果要使用重定向,你应该使用如下代码:

String str;
SPSite oSPSite = null;
SPWeb oSPWeb = null;
try
{
   oSPSite = new SPSite("http://server");
   oSPWeb = oSPSite.OpenWeb(..);

   str = oSPWeb.Title;
   if(bDoRedirection)
   {
            //在重定向之前,清空相关对象
       if (oSPWeb != null)
          oSPWeb.Dispose();
   
       if (oSPSite != null)
          oSPSite.Dispose();

       Response.Redirect("newpage.aspx");
   }
}
catch(Exception e)
{
}
finally
{
   if (oSPWeb != null)
     oSPWeb.Dispose();

   if (oSPSite != null)
      oSPSite.Dispose();
}

4. 除了SPSite和SPWeb两个对象类以外,要注意的是,当你访问SPSite.RootWeb和SPWeb.ParentWeb 这两个属性后,你需要清除RootWeb产生的对象。例如:

String str;
SPSite oSPSite = new SPSite("http://server");

str = oSPSite.RootWeb.Title;
str = oSPSite.RootWeb.Url;

... additional processing on RootWeb ...

oSPSite.RootWeb.Dispose(); //注意要删除RootWeb产生的对象
oSPSite.Dispose();

在开发过程中,这些代码编写的细节往往会影响整个系统性能,所有在学习开发时就要养成良好的代码规范。。
moss.net (2008-7-09 15:05:17)
接上面内容,我们针对SPSite和SPWeb对象分析哪些方法或属性会产生对象并讨论如何在不需要时清除这些对象。

SPSite对象

通常在调用SPSite对象构造函数后,你需要在使用完后调用Dispose方法来清空对象。但是,如果你使用SPControl.GetContextSite来获取对象那么你不能使用Dispose来清空对象。因为通过这种方式获得的SPSite或者SPWeb对象会保留一份内部列表信息,当使用Dispose对象后,可能会产生无法预测的错误。实际上,WSS会在页面结束后清空这些对象。

下面,我们分析一下有关SPSite类的方法和属性会产生对象以及如何清空这些对象

SPSiteCollection类
1.SPSiteCollection.Add方法:通过这个方法会创建并返回一个SPSite对象,在不需要使用该对象后,你应该清除内存中的对象。

例:
SPGlobalAdmin oSPGlobalAdmin    = new SPGlobalAdmin();
SPSiteCollection aSites  = oSPGlobalAdmin.VirtualServers[0].Sites;

SPSite oSPSite = aSites.Add( ... );
... Process the site info ...
oSPSite.Dispose();
oSPGlobalAdmin.Dispose();

通过SPSiteCollection [ ] 索引来获得SPSite,在下面的例子是没有及时清除没有的对象的范例。

int j;
SPSite oSPSite;
SPGlobalAdmin oSPGlobalAdmin    = new SPGlobalAdmin();
SPSiteCollection aSites  = oSPGlobalAdmin.VirtualServers[0].Sites;

for (j = 0;j < aSites.Count;j++)
{
   oSPSite = aSites[j];
   BuildTableRow(oDisplayTable, "Site", oSPSite.Url);
}
oSPGlobalAdmin.Dispose();

这里,我们建议在循环中加入Dispose方法以清空产生的SPSite对象,例:

int j;
SPSite oSPSite;
SPGlobalAdmin oSPGlobalAdmin    = new SPGlobalAdmin();
SPSiteCollection aSites  = oSPGlobalAdmin.VirtualServers[0].Sites;

for(j = 0;j < aSites.Count;j++)
{
   oSPSite = aSites[j];
   BuildTableRow(oDisplayTable, "Site", oSPSite.Url);
   oSPSite.Dispose();
}

oSPGlobalAdmin.Dispose();

2.SPSite.AllWebs属性

SPSites.AllWebs.Add方法:创建并返回SPWeb对象,在不需要使用该对象后,你应该清除内存中的对象,例:
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);

oSPWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...
oSPWeb.Dispose();

3.SPSite.AllWebs [ ] 索引操作在每次访问对象后会返回SPWeb实例,下面的例子会产生大量SPWeb对象。

int j;
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);

for(i=0;j < oSPSite.AllWebs.Count; j++)
{
   oSPWeb = oSPSite.AllWebs[j];
   BuildTableRow(oDisplayTable, "Web", oSPWeb.Title);
}

建议在循环中调用Dispose方法清除对象,例:

int j;
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
for(j = 0;j < oSPSite.AllWebs.Count; j++)
{
   oSPWeb = oSPSite.AllWebs[j];
   BuildTableRow(oDisplayTable, "Web", oSPWeb.Title);
   oSPWeb.Dispose();
}

或者:

int j;
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
for(j = 0;j < oSPSite.AllWebs.Count; j++)
{
   using(oSPWeb = oSPSite.AllWebs[j])
   {
      BuildTableRow(oDisplayTable, "Web", oSPWeb.Title);
   }
}

4.SPSite.OpenWeb 和 SPSite. SelfServiceCreateSite 方法:这两个方法都会返回SPWeb对象,你应该按照下面例子方式处理SPWeb对象。

SPSite oSPSite = new SPSite("http://Server");
SPWeb oSPWeb = oSPSite.OpenWeb(..);
... additional processing ...
oSPWeb.Dispose();
oSPSite.Dispose();

5.SPSite.LockIssue, SPSite.Owner, and SPSite.SecondaryContact 属性

由于这3个属性会产生SPSite.RootWeb引用,所以,清空对象方法应该如下:

String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.LockIssue;
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();

6.SPSite.RootWeb 属性:

在之前提到过RootWeb属性,在利用RootWeb的属性后需要使用清空相关对象,例:

String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.RootWeb.Title;
... additional processing ...
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();

SPWeb 对象

1.SPWeb.ParentWeb属性:第一次调用SPWeb.ParentWeb的时候,它会判断赋值的成员变量是否是NULL值,如果成员变量为NULL并且上级站点,那么它自动调用OPERWEB方法产生一个SPWeb对象,下次在访问时候只是返回保存在变量中的值。

例:
String str;
SPSite oSPSite = new SPSite("http://server");
SPWeb oSPWeb, oSPWebParent;
oSPWeb       = oSPSite.OpenWeb();
oSPWebParent = oSPWeb.ParentWeb;

if (oSPWebParent != null)
{
   ... additional processing ...
}

if (oSPWebParent != null)   oSPWebParent.Dispose();

oSPWeb.Dispose();
oSPSite.Dispose();

2.SPWeb.Webs 属性

SPWeb.Webs.Add 方法:创建并返回SPWeb对象,在不需要使用该对象后,你应该清除内存中的对象,例:
SPWeb oSPWeb
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPSWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...
oSPWeb.Dispose();

3.SPWeb.Webs[ ] 索引操作和SPSite.Webs相同,在每次访问对象后会返回SPWeb实例,下面的例子会产生大量SPWeb对象。

int j;
SPWeb oSPWeb, oSPWeb2;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.OpenWeb();

for(j = 0;j < oSPWeb.Webs.Count;j++)
{
   oSPWeb2 = oSPWeb.Webs[j];
   BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);
}

建议在循环中清除对象。

int j;
SPWeb oSPWeb, oSPWeb2;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.OpenWeb();

for(j = 0;j < oSPWeb.Webs.Count;j++)
{
   oSPWeb2 = oSPWeb.Webs[j];
   BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);
   oSPWeb2.Dispose();
}
oSPWeb.Dispose();

其他需要清除的对象

1.Microsoft.SharePoint.Portal.SiteData.Area.Web 属性在每次访问后返回一个新的SPWeb对象。在使用后应该及时清除对象。
例:

String str;
Area oArea = AreaManager.GetArea(PortalContext.Current, new Guid(AreaGiud);
SPWeb oSPWeb = oArea.Web;
str = oSPweb.Title;
str = oSPWeb.Url;
...
oSPWeb.Dispose();

或者:

String str;
Area oArea = AreaManager.GetArea(PortalContext.Current, new
   Guid(AreaGiud);
using(SPWeb oSPWeb = oArea.Web)
{
   str = oSPweb.Title;
   str = oSPWeb.Url;
}

2.SPControl.GetContextSite和 SPControl.GetContextWeb 方法:在前面有提到,这里方法返回对象不能通过Dispose来清除,可能会产生不可预期的错误。以下做法是错误的:

SPSite oSPSite = SPControl.GetContextSite(..);
... additional processing ...
oSPSite.Dispose();

正确的方法应该是:

SPSite oSPSite = SPControl.GetContextSite(..);
SPWeb oSPWeb = oSPSite.OpenWeb(..);
... additional processing ...
oSPWeb.Dispose();

或者:

SPSite oSPSite = SPControl.GetContextSite(..);
using(SPWeb oSPWeb = oSPsite.OpenWeb())
{
   ... additional processing ...
}

3.WebPartPage.RootWeb 属性:和SPSite.RootWeb 属性相同。只有当WebPartPage.IsRootWeb为True时才需要清除对象,例如:

String str;
WebPartPage oWebPartPage = new WebPartPage();
str = oWebPartPage.RootWeb.Title;
... additional processing ...
if(oWebPartPage.Web.IsRootWeb
   oWebPartPage.Dispose();

大部分Sharepoint对象都实现IDisposable接口,当你不使用对象时应该清除该对象,避免在内存中保存过多对象。

文章来源: http://www.winos.cn/viewthread-38689.html

转载于:https://www.cnblogs.com/LeimOO/archive/2009/07/20/1527093.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值