zoukankan      html  css  js  c++  java
  • 正确使用 SharePoint 对象模型避免内存泄漏

    将托管代码中的 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[i];
       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();

    SPWeb.ParentWeb属性最开始时为空值,在你第一次使用它的时候,他会调用OpenWeb方法.你必须让它和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();

    SPWeb.Webs.Add方法会返回一个new出来的对象。你必须手动释放他。
    你在使用SPWeb.Webs[ ]索引指示器时,返回的对象都是new出来,你必须手动释放他。

    WebPartPage.RootWeb 属性和SPSite.RootWeb属性类似。最开始时为空值,在你第一次使用它的时候,他会调用SPSite.OpenWeb方法创建一个新的对象.你必须以下面的方式释放他。
    String str;
    WebPartPage oWebPartPage = new WebPartPage();

    str = oWebPartPage.RootWeb.Title;

    ... additional processing ...

    if(oWebPartPage.Web.IsRootWeb!=null)
       oWebPartPage.Dispose();

  • 相关阅读:
    粤语·简约学习笔记
    Linux的网卡由eth0变成了eth1
    RedHat 更新CentOS Yum源
    Lamp 搭建
    像淘宝、京东这样的大型电商网站服务器构架完全部署方案
    完成静态服务器——Node.js摸石头系列之四
    实现使用Websocket通讯的聊天室——Node.js摸石头系列之六
    Node.js摸石头系列目录
    Aptana studio 3 修改配色方案
    Node.js 的安装和控制台命令——Node.js摸石头系列之一
  • 原文地址:https://www.cnblogs.com/hqbird/p/2043951.html
Copyright © 2011-2022 走看看