我已经就这个话题争论了几天了。我查看了几个博客,还用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块中)上:
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块时:
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块上)吗?
发布于 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被正确处理。
发布于 2013-02-08 04:17:27
您不应该处理不是您创建的SPSite/Web,尤其是在运行某个功能的事件处理程序时传递给您的SPContext.Current或site/web。
在剩下的时间里,你应该处理掉它,通常使用using是最简单的。
发布于 2013-02-08 04:25:59
我注意到,并不是所有的东西都像文档保证的那样关闭和处理。例如: Microsoft JET或ACE Acces在使用Ole对象时不会关闭连接。
以下讨论针对正确实现IDispose的项目
Dispose()。所以,我想这一切都取决于你如何在你的代码中使用它。
我希望这能帮到你。然而,这并不是一个很好的答案。
https://stackoverflow.com/questions/14760139
复制相似问题