【发布时间】:2010-11-17 07:05:04
【问题描述】:
更新于 06/08/2009 15:52:简答 否。原始问题:
我找不到任何关于 SPWeb.Site 处置指导的参考资料。我浏览了一些关于处置 SharePoint 对象的更流行的最佳实践文档:
- http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
- http://msdn.microsoft.com/en-us/library/aa973248.aspx
- http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx
很遗憾,这些指南均未提及 SPWeb.Site。为了提供一些上下文,我正在编写一个公共扩展 API,它接受 SPWeb 作为方法的参数,即:
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
我查看了 SPWeb 反射器中的 Close() 方法,该方法由 SPWeb.Dispose() 调用,其中没有任何内容表明实际的 SPSite 成员字段已被处理。
更新:06/08/2009 13:47
在Alex's建议
“将其放入一个运行 100 次的循环中,并使用在 WSS v3 和 MOSS 2007 中排除 SPSite/SPWeb 泄漏中描述的 SPRequestStackTrace 注册表项来检查您的测试代码是否是问题的根源。”
我运行了 webpart 中包含的以下代码:
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
SharePoint 日志中未显示任何内容。
虽然我不愿从这个幼稚的实验中得出任何真正的结论,但它表明没有有必要处置 SPWeb.Site。如果能从对此主题更了解的人那里得到具体的回答,那就太好了。
更新:06/08/2009 14:52 在 Greg 的评论的提示下,我计算出了 m_Site 的分配,看起来它最终总是通过内部构造函数传递给 SPWeb。例如。 SPWeb.OpenWeb 将 this 传递给 new SPWeb()。所以我更确定 SPWeb.Site 应该不被处理掉,如果被处理确实会导致问题。
【问题讨论】:
-
看这个,不清楚。我问了与 Roger Lamb 帖子评论相同的问题,但没有得到回复。
-
在我看来,这只是一个意见,不,你不应该处理那个对象。为什么?嗯,它是通过另一个对象的属性返回的。如果其他对象是一次性的,您应该处置 那个,并让它处理自己的资源。您从属性中读取的任何内容都不应由您自己的代码处理,在我看来,这将构成该框架中的错误。
-
@lasse-v-karlsen 我 100% 同意你的观点,但是 SharePoint API 中存在许多怪癖,你真的需要了解这些怪癖,否则会有内存泄漏的风险。因此,虽然它可能是 API 中的一个错误,但我想了解它是否存在 :)
-
Keith Dahlby 尝试为 SPList.ParentWeb 解决这个问题的过程:solutionizing.net/2008/08/10/is-splistparentweb-a-leak
-
很好的讨论和实验在这里 - 抱歉我错过了! :)
标签: sharepoint dispose