Утилизируйте объект SPWEB в рекурсивной функции
-
09-12-2019 - |
Вопрос
Я обновил свой код согласно предложениям от предложений на моем
Ниже приведен фрагмент кода для рекурсивной петли через все веб / подбэбсы: -
private void IterateLists(SPWeb web, ArrayList _lists)
{
//Add information ablout all the lists and Last Modified dates
foreach (SPList thisList in web.Lists)
{
if (!(thisList.Hidden) && (thisList.Title != _userInformationList))
{
//Add the list information onto the Lists collection
_lists.Add(new ListInfo { WebUrl = web.Url, ListName = thisList.Title, LastModified = thisList.LastItemModifiedDate.ToLocalTime(), TimeDelta = SPUtility.TimeDeltaAsString(thisList.LastItemModifiedDate.ToLocalTime(), DateTime.Now.ToLocalTime()), });
}
//Call this method recursively if this web has subwebs
foreach (SPWeb subWeb in web.Webs)
{
try
{
IterateLists(subWeb, _lists);
}
finally
{
if (subWeb != null)
subWeb.Dispose();
}
}
}
}
.
Он имеет код для утилизации объекта SUBWEB в заблокированном блоке.У меня есть огромное веб-приложение SharePoint со многими сайтами и дополнительными сайтами.Я вижу следующую ошибку для этого конкретного метода.
потенциально чрезмерное количество сердечников Sprequest (2859), в данный момент несемянным в потоке 9. Убедитесь, что этот объект или его родитель (например, SPWEB или SPSITE) правильно утилизируется.Этот объект держит отдельную родную кучу. Идентификатор распределения для этого объекта: {9379E575-1358-4D65-B798-7B8165-B798-7B8165-B798-7B81EE167112} Стек Изследует от текущего распределения:
Решение
Почему вы итерация по каждой сети для каждого списка?Разве это не должно быть
private void IterateLists(SPWeb web, ArrayList _lists)
{
//Add information ablout all the lists and Last Modified dates
foreach (SPList thisList in web.Lists)
{
if (!(thisList.Hidden) && (thisList.Title != _userInformationList))
{
//Add the list information onto the Lists collection
_lists.Add(new ListInfo { WebUrl = web.Url, ListName = thisList.Title, LastModified = thisList.LastItemModifiedDate.ToLocalTime(), TimeDelta = SPUtility.TimeDeltaAsString(thisList.LastItemModifiedDate.ToLocalTime(), DateTime.Now.ToLocalTime()), });
}
}
//Call this method recursively if this web has subwebs
foreach (SPWeb subWeb in web.Webs)
{
try
{
IterateLists(subWeb, _lists);
}
catch(Expection e){}
}
web.Dispose();
}
.
В противном случае вы проходите через каждую дополнительную площадку для каждого из списков, а не все в списке на сайте, то все его субзиты.
И, как отражено в приведенном выше, вы должны сделать распоряжение в функции на уровне текущей сети, а не в контуре Foreach.Интернет никогда не будет NULL, если бы она была в коллекции веб-коллекции и, таким образом, функция вызвала его.
Вы могли бы сделать if(web != null)
по всему блоку, если вы беспокоились об этом.