首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sharepoint spweb和spsite处置

sharepoint spweb和spsite处置
EN

Stack Overflow用户
提问于 2010-05-21 04:10:40
回答 4查看 1.4K关注 0票数 2

我一直在.NET 1.1 SharePoint 2003环境中使用以下代码,它工作得很好:

代码语言:javascript
复制
            try
            {
                site = SPControl.GetContextSite(Context);
                web = site.OpenWeb();
                ...
            }
            catch (Exception export)
            {
                output.Write("Caught Exception: <br/><br/>");
                output.Write(export.Message + "<br><br>");
                output.Write(export.StackTrace);
            }
            finally
            {
                if (web != null)
                    web.Dispose();
                if (site != null)
                    site.Dispose();
            }

但是,我目前正在将代码移植到.NET 2.0 SharePoint 2007环境中,并收到以下错误消息:

“尝试使用已关闭或释放并不再有效的SPWeb对象。”

如果我注释掉Dispose()代码,它会工作得很好。但是这不会导致内存泄漏吗?解决这个问题的最好方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-21 07:55:50

当您从GetContextSite获取SPSite对象时,您将获得一个与该页面上运行的其他对象共享的对象。

在您处理它之后,其他代码正在尝试使用它-因此出现了错误。

您应该只释放您自己创建的对象,而不是使用GetContextSite获得的对象。

快速解决方法是(正如Iambriansreed所说的)删除finally块,并将前两行替换为。

代码语言:javascript
复制
SPSite site = SPContext.Current.Site; // Do you even need this?
SPweb web = SPContext.Current.Web;

更好的性能和无内存泄漏,因为SharePoint框架处理通过SPContext检索的对象的创建和处置。

然而,这是一个复杂且缺乏理解力的主题,因此通读Best Practices: Using Disposable Windows SharePoint Services Objects并使用SPDisposeCheck tool是必不可少的。

票数 2
EN

Stack Overflow用户

发布于 2010-05-21 04:16:11

在处理可释放对象时,尤其是在处理SharePoint时,使用using会更简单

代码语言:javascript
复制
using(SPSite site = new SPSite("..."))
using(SPWeb web = site.OpenWeb("..."))
{

}

但是,请注意,您不应该处置来自当前上下文的元素-它们是共享的,处置它们可能会导致此错误。这是一个常见的错误,在我看来,API应该处理得更好。

另请参阅- Using Disposable Windows SharePoint Services Objects

SPContext对象由SharePoint框架管理,不应在代码中显式处理。对于由SPContext.Site、SPContext.Current.Site、SPContext.Web和SPContext.Current.Web返回的SPSite和SPWeb对象也是如此。

票数 1
EN

Stack Overflow用户

发布于 2010-05-21 04:17:04

还有一种更好的方法来做上面的事情:

代码语言:javascript
复制
site = SPControl.GetContextSite(Context);
web = site.OpenWeb()

如下所示:

代码语言:javascript
复制
SPSite site = SPContext.Current.Site;
SPweb web = SPContext.Current.Web;

这里没有内存泄漏。说真的,要去2007年,而不是2010年?

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

https://stackoverflow.com/questions/2877429

复制
相关文章

相似问题

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