设为首页 收藏本站
查看: 1236|回复: 0

[经验分享] 正确使用 SharePoint 对象避免内存泄漏

[复制链接]

尚未签到

发表于 2015-9-27 11:14:14 | 显示全部楼层 |阅读模式
  各位兄弟姐妹们,你们有没有为在使用SharePoint对象时出现的内存泄漏而苦恼?有没有为性能下降而痛苦?以下为我从MSDN找来的几篇文章,我把它们翻成了中文,并整理了一下。希望对大家有所帮助。
  将托管代码中的 Microsoft.SharePoint.SPSite 和 Microsoft.SharePoint.SPWeb 对象创建为小包装(大小约为 2 KB)。此包装随后创建非托管对象,其平均大小约为 1–2 MB。如果你使用如下代码
foreach(SPWeb oSubWeb in oSPWeb.GetSubWebsForCurrentUser())
{
    // .. Add subweb information for navigation ..
}
假定oSPWeb.GetSubWebsForCurrentUser()返回十个SPWeb对象,如果你不手动释放这些对象的话,你很快就失去了至少10MB内存了。
正确的做法是
foreach(SPWeb oSubWeb in oSPWeb.GetSubWebsForCurrentUser()))
{
    // .. Add subweb information for navigation ..
    oSubWeb.Dispose();
}

  你可以使用Dispose或Close,基本上他们是一样的。在SPWeb和SPSite中Dispose方法只是简单的调用了Close方法。但是一般推荐使用Dispose方法。因为标准的.net process是调用Dispose的,其次它能确保你的代码未来依然可以正常运行。
  你还可以使用using语句自动释放实现了IDisposable接口的对象。
using(SPSite oSPsite = new SPSite("http://server"))
{
  using(SPWeb oSPWeb = oSPSite.OpenWeb())
   {
       str = oSPWeb.Title;
   }
}  

  使用try{}catch{}finally{}语句。在finally中释放对象是一个不错的选择。但是要注意,如果你在try代码块中调用了Response.Redirect的话,finally代码块中得代码就不会被调用了。
  不要处理直接从 Microsoft.SharePoint.SPContext.Site 或 Microsoft.SharePoint.SPContext.Web 属性返回的任何项目。否则会导致 SharePoint 系统不稳定,并可导致应用程序出现故障。
  从GetContextSite()方法中获得的对象不需要释放。否则会导致 SharePoint 系统不稳定,并可导致应用程序出现故障。
  如果你的对象是使用 new 关键字创建的话,你必须手动释放他。
SPSite oSPSite = new SPSite("http://server");
... additional processing on SPSite ...
oSPSite.Dispose();

  使用SharePoint方法返回的其它SPWeb的对象必须被手动释放。(比如SPSite.OpenWeb)
String str;
SPSite oSPSite = new SPSite("http://server");
SPWeb oSPWeb = oSPSite.OpenWeb();
str = oSPWeb.Title;
... additional processing on SPWeb ...
oSPWeb.Dispose();
oSPSite.Dispose();

  SPSite.RootWeb属性和SPWeb.ParentWeb属性在你访问他们的时候,会创建一个新的对象并把它存入一个本地的成员变量中。以后无论你怎么访问他,访问的都是这个本地的成员变量。所以你可以随便访问他,但最后要记得释放他。
String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.RootWeb.Title;
... additional processing on RootWeb ...
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();

  如果是使用new关键字创建的SPSite对象,必须调用Dispose方法释放,但如果是调用SPControl.GetContextSite返回的话,就千万不要去释放他,这样会引起SharePoint出异常。
  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的索引指示器访问的话,每次都会创建一个新的对象,就算你以前访问过也一样。所以每次访问后,一定要记得释放(真变态!!!!)
int i;
SPSite oSPSite;

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

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

  oSPGlobalAdmin.Dispose();

SPSites.AllWebs.Add方法每次都会创建并返回一个新的SPWeb对象,一定要记得手动释放。
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...
oSPWeb.Dispose();

  SPSite.AllWebs [ ]索引指示器每次都会返回一个新的,需要被释放。(无以伦比的变态!!!)
  所有通过SPSite.OpenWeb和SPSite.SelfServiceCreateSite方法创建的SPWeb对象都必须手动释放。
  SPSite.LockIssue, SPSite.Owner, 和SPSite.SecondaryContact属性都会引用顶级站点并使用SPSite.RootWeb属性。所以在使用这几个对象的时候都必须释放 SPSite.RootWeb对象。(存心的吧,不说的话打死我也想不到。。。。。。)
  String str;
SPSite oSPSite = new SPSite("http://server");

  str = oSPSite.LockIssue;

oSPSite.RootWeb.Dispose();
oSPSite.Dispose();

  (未完待续)
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119418-1-1.html 上篇帖子: 基于SharePoint 工作流的InfoPath 2010的报修系统的建立:第二章 报修单的总体设计 下篇帖子: 招聘SharePoint Developer
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表