Вопрос

Я обновил свой код согласно предложениям от предложений на моем Ранее вопрос я все еще вижу сообщение об ошибке для одной из моих рекурсивных функций.

Ниже приведен фрагмент кода для рекурсивной петли через все веб / подбэбсы: -

        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) по всему блоку, если вы беспокоились об этом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top