首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否总是需要调用SPSite.dispose()和SPWeb.dispose()?

是否总是需要调用SPSite.dispose()和SPWeb.dispose()?
EN

Stack Overflow用户
提问于 2013-02-08 04:14:04
回答 3查看 3K关注 0票数 1

我已经就这个话题争论了几天了。我查看了几个博客,还用SPDisposeChecker.exe做了一些测试。关于何时必须调用Dispose(),似乎有各种不同的想法。例如,克里斯蒂安·格雷斯纳的这篇博客:

http://www.ilovesharepoint.com/2010/03/sharepoint-disposing-myths.html

他说没有必要一直使用SPWeb来处理web。

但是,Microsoft的最佳实践建议将所有的Openweb。http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

在下面的代码块(有点旧,不在Using块中)上:

代码语言:javascript
复制
       try
      {

          SPSite site = new SPSite("http://mysite.aspx");
          web = site.OpenWeb();
          site.Dispose();
          site = null;
      }
      catch (System.IO.FileNotFoundException x)
      {
          return;
      }         

如果我用SPDisposeCheck快速检查,它会给出一个错误:

web =site.OpenWeb()行上的"Disposable type not dispose“;

但是当我放入一个像这样的finally块时:

代码语言:javascript
复制
  finally
      {
        if (web != null)
         web.Dispose();
      }

SPDisposeCheck给出以下错误:“注意:不应该在这个对象上调用Dispose”

在做了一些研究后,我发现SPDispose上有一些bug,正如这篇博客所解释的那样

http://social.msdn.microsoft.com/Forums/is/sharepointdevelopmentlegacy/thread/3fe362b3-cc03-43e5-a076-bf37dd8175c9

因此,我对我的研究仍然有些不满意。我的意思是,当然,遵循微软的最佳实践是好的,它建议总是使用Dispose()。然而,对于何时和何时不处理,我仍然不完全满意。

还有“当你处理SPSite时,它会循环”m_openedWebs“中的所有SPWebs,并对每个m_openedWebs调用Close方法”,这是一个正确的说法吗?

回到我的代码块,这里真的需要一个SPWeb.Dispose (在finally块上)吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-08 04:29:54

我是SharePoint的MCSD,我在SharePoint上做了很多维护编程。当谈到SharePoint API时,我倾向于保守,因为我经历了它们的演变,看到了它们成长的痛苦。

我给你的建议是,如果你打开一个网页(或其他SharePoint一次性对象),最好在你使用完后立即处理掉它。即使在SPWebs被自动丢弃的情况下,回收该对象的资源也可能是您最感兴趣的。如果一个站点有1,000个webs,您是否希望在遍历这些站点时将它们全部打开?可能不会。显然,如果您正在接收上下文对象,则应该保留这些对象--您不是在创建它们,所以它们实际上不是您的责任。

The best practice for SPSite.OpenWeb说“(由OpenWeb返回的SPWeb )没有存储在SPSite对象中,也不会在SPSite类的任何地方被释放。因此,你应该销毁通过这些方法创建的任何对象。所以,我不确定它是如何添加到m_openedWebs中的。所以,关于你的问题,”当你处置SPSite时,它循环通过“m_openedWebs”中的所有SPWebs,并调用每个“这是一个正确的语句吗?”的Close方法。是的,从技术上讲,它是正确的。你能依靠m_openedWebs来包含你打开的每个站点吗?可能不会。因此,我将添加finally块,并确保SPWeb被正确处理。

票数 1
EN

Stack Overflow用户

发布于 2013-02-08 04:17:27

您不应该处理不是您创建的SPSite/Web,尤其是在运行某个功能的事件处理程序时传递给您的SPContext.Current或site/web。

在剩下的时间里,你应该处理掉它,通常使用using是最简单的。

票数 0
EN

Stack Overflow用户

发布于 2013-02-08 04:25:59

我注意到,并不是所有的东西都像文档保证的那样关闭和处理。例如: Microsoft JET或ACE Acces在使用Ole对象时不会关闭连接。

以下讨论针对正确实现IDispose的项目

  • 我发现,如果我只是周期性地访问一个方法(大约每小时一次),我可以等待垃圾回收器(GC)为我处理该项目。
  • 如果我正在进行一个将迭代多个项目的调用,那么在我完成创建的对象时,最好的方法似乎是对该对象调用Dispose()

所以,我想这一切都取决于你如何在你的代码中使用它。

我希望这能帮到你。然而,这并不是一个很好的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14760139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档