#sharepoint #dispose #csom
#sharepoint #утилизировать #csom
Вопрос:
Мне нужен совет по журналам sharepoint, связанным с удалением объектов.
Я просматривал журналы и нашел эти :
Неожиданно обнаружено использование SPRequest для ранее закрытого объекта SPWeb.Пожалуйста, закройте объекты SPWeb, когда вы закончите со всеми объектами, полученными из них, но не раньше.
Stack trace:
at Microsoft.SharePoint.SPFile.PropertiesCore(Boolean throwException)
at Microsoft.SharePoint.SPFile.get_CheckInComment()
...
Отслеживаемый объект 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, SPBasePermissionsamp; 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:
Я бы записал идентификатор элемента, который вы хотите удалить, в коллекции чисел. Должно быть достаточно массива или списка объектов.
Затем после вашего foreach проверьте, содержит ли ваша коллекция какие-либо идентификаторы. затем выполните
for(int i = 0, i < collection.count(), i){
#get your item
#delete your item
#call the correct update method on your list.
}
Я не мог сказать вам, почему у вас возникает проблема с удалением.
Приветствия
Truez
Комментарии:
1. Спасибо за ответ Truezplaya. К сожалению, прямо сейчас мне приходится удалять элементы в цикле, потому что в разделе «делать что-то с данными currItem» происходит много вещей, иначе мне пришлось бы переписать довольно много кода, который я не писал в первую очередь. Но, возможно, это то, что мне придется делать, если ответ не найден. Я ленив, и это был простой способ 😉