1

这几天我一直在讨论这个话题。我查看了几个博客并使用 SPDisposeChecker.exe 进行了一些测试。关于何时必须调用 Dispose() 似乎有各种想法。例如 Christian Glessner 的这个博客:

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 块内)::

       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(); 的行上

但是当我放一个 finally 块时:

  finally
      {
        if (web != null)
         web.Dispose();
      }

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

做了一些研究,我发现 SPDispose 有一些错误,正如这个博客所解释的那样

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

所以我对我的研究仍然有点不满意。我的意思是,遵循 Microsoft 的最佳实践是好的,它建议始终使用 Dispose()。但是,对于何时以及何时不处置,我仍然不完全满意。

此外,“当您处理 SPSite 时,它​​会遍历“m_openedWebs”中的所有 SPWeb 并在每个上调用 Close 方法”这是正确的说法吗?

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

4

3 回答 3

1

我是 SharePoint 的 MCSD,我在 SharePoint 上进行了大量维护编程。在谈到 SharePoint API 时,我倾向于保守,因为我经历了它们的演变过程,并且见证了它们成长的许多痛苦。

我对您的建议是,如果您打开一个 Web(或其他 SharePoint 一次性对象),最好在完成后立即将其丢弃。即使在 SPWeb 被自动处置的情况下,回收该对象的资源也可能符合您的最佳利益。如果一个网站有 1,000 个网站,您是否希望在遍历它们时保持它们全部打开?可能不是。显然,如果你收到一个上下文对象,你应该留下它们——你不是在创建它们,所以它们并不是你真正的责任。

SPSite.OpenWeb 的最佳实践是“(OpenWeb 返回的 SPWeb)没有存储在 SPSite 对象中,也没有在 SPSite 类中的任何位置处理。因此,您应该处理通过这些方法创建的任何对象。所以m_openedWebs“ _ ,是的,从技术上讲,它是正确的。您能否依靠 m_openedWebs 来包含您打开的每个站点?可能不是。因此,我将添加 finally 块并确保 SPWeb 得到正确处理。

于 2013-02-07T20:29:54.210 回答
0

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

其余的时间你都应该处理它,通常使用 ausing是最简单的。

于 2013-02-07T20:17:27.360 回答
0

我注意到并非所有事情都像文档保证那样关闭和处置。恰当的例子:Microsoft JET 或 ACE Acces 在使用 Ole 对象时不会关闭连接。

以下讨论适用于正确实施的项目IDispose

  • 我发现如果我只想定期访问一个方法(大约一小时一次),我可以等待垃圾收集器 (GC) 为我处理该项目。

  • 如果我正在进行一个将迭代多个项目的调用,那么最好Dispose()在我完成它时实际调用我创建的对象。

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

我希望这有帮助。不过,这并不是一个很好的答案。

于 2013-02-07T20:25:58.757 回答