SharePoint Dispose SPWeb,SPSite和对象

时间:2016-10-05 13:07:46

标签: sharepoint dispose csom

我需要有关处理对象的sharepoint日志的建议。

我在查看日志并找到了这些:

意外检测到对先前关闭的SPWeb对象使用SPRequest。 当你完成从它们获得的所有对象时,请关闭SPWeb对象,但不是之前。

Stack trace:
    at Microsoft.SharePoint.SPFile.PropertiesCore(Boolean throwException) 
    at Microsoft.SharePoint.SPFile.get_CheckInComment() 
    ...

Monitorable在此主题结束之前未处理SPRequest对象。

为避免浪费系统资源,请在使用完毕后立即处理此对象或其父对象(如SPSite或SPWeb)。现在将处理此对象。

This SPRequest was allocated at
    at Microsoft.SharePoint.Library.SPRequest..ctor() 
    at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(SPSite site, String name, Boolean bNotGlobalAdminCode, String strUrl, Boolean bNotAddToContext, Byte[] UserToken, String userName, Boolean bIgnoreTokenTimeout, Boolean bAsAnonymous) 
    at Microsoft.SharePoint.SPWeb.InitializeSPRequest() 
    at Microsoft.SharePoint.SPWeb.GetFileOrFolderProperties(String strUrl, ListDocsFlags listDocsFlags, Boolean throwException, SPBasePermissions& permMask) 
    at Microsoft.SharePoint.SPFile.PropertiesCore(Boolean throwException) 
    at Microsoft.SharePoint.SPFile.get_CheckInComment() 
    ...

我无法弄清楚这两个代码之间的主要区别是什么,因为我以相同的方式处理对象。

For循环有什么问题?

创建日志错误的代码:

using (SPSite site = new SPSite(url))
{
    using (SPWeb web = site.OpenWeb())
    {
        string serverRelativeUrl = SPUrlUtility.CombineUrl(web.ServerRelativeUrl, listRelativeUrl);
        SPList lst =  web.GetList(serverRelativeUrl);

        items = lst.Items;

        if (items != null)
        {
            int nb = items.Count;
            for (int i = nb - 1; i > -1; i--)
            {
                currItem =items[i];

                if (currItem.File.CheckInComment.Equals(comment1) || currItem.File.CheckInComment.Equals(comment2))
                {
                    publish = true;
                }

                if(publish)
                {
                    //do stuff with currItem data
                }
            }
        }
    }
}

不会产生日志错误的代码:

    using (SPSite site = new SPSite(url))
{
    using (SPWeb web = site.OpenWeb())
    {
        string serverRelativeUrl = SPUrlUtility.CombineUrl(web.ServerRelativeUrl, listRelativeUrl);
        SPList lst =  web.GetList(serverRelativeUrl);

        items = lst.Items;

        if (items != null)
        {
            foreach(SPListItem currItem in items )
            {           
                if (currItem.File.CheckInComment.Equals(comment1) || currItem.File.CheckInComment.Equals(comment2))
                {
                    publish = true;
                }

                if(publish)
                {
                    //do stuff with currItem data
                }
            }
        }
    }
}

我需要使用For循环,因为我需要删除枚举中的项目,我将无法使用foreach循环。

如果您有任何想法请帮助我。

感谢。

1 个答案:

答案 0 :(得分:0)

我会在数字集合中捕获您要删除的项目的ID。数组或对象列表就足够了。

然后在你的foreach之后检查你的收藏是否包含任何ID。然后做你的

for(int i = 0, i < collection.count(), ++i){
 #get your item 
 #delete your item 
 #call the correct update method on your list.
}

我无法告诉你为什么要处理处理问题。

干杯

Truez