更新于 2009 年 06 月 08 日 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,该 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 的建议:
"将其放入循环中运行100次,并使用“Troubleshooting SPSite / SPWeb leaks in WSS v3 and MOSS 2007”中描述的SPRequestStackTrace注册表键来检查您的测试代码是否是问题的来源。"
我在 Web 部件中包含了以下代码:
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。有人能够给出关于这个问题更加权威的答案会很好。
更新:2009年06月08日 14:52 受 Greg 评论的启发,我解析了 m_Site 的赋值情况,结果显示它始终通过内部构造函数传递给 SPWeb。例如,SPWeb.OpenWeb 将 this 传递给 new SPWeb()。因此,我更确定 SPWeb.Site 不应该被释放,如果释放可能会导致问题。