Утилизация SharePoint SPSite
Сценарий, который у меня есть, находится в методе выполнения SPJobDefinition. Я хочу пройти через каждый SPSite в веб-приложении. Итак, у меня есть следующий код:
foreach (SPSite site in this.WebApplication.Sites)
{
...
}
Вопрос в том, нужно ли мне распоряжаться каждым сайтом? Правило, которым я обычно придерживаюсь, - это распоряжаться или помещать в использование, только если я сам его создаю. Будет ли свойство Sites фактически содержать полностью сконструированные объекты сайта, на которые я буду ссылаться только в этом коде. Если так, то удаление сайтов будет опасным, так как я изменяю другой объект, который может их захотеть. Или наоборот: свойство Sites создает объекты по запросу... в каком случае я отвечаю за них?
Плюс, как мне распоряжаться ими, если мне нужно это сделать. Я не могу использовать использование в этом случае, и вызовет ли распоряжение внутри foreach нарушить перечисление?
3 ответа
Да, вы делаете. См. "Написание приложений, которые масштабируются до большого числа пользователей" в Рекомендации: общие проблемы кодирования при использовании объектной модели SharePoint. Правильный шаблон:
foreach (SPSite site in this.WebApplication.Sites)
{
try
{
...
}
finally
{
site.Dispose();
}
}
Вызов утилизировать не нарушит перечисление. Он просто очищает неуправляемую память, используемую объектом.
Посмотрите здесь - Рекомендации: использование одноразовых объектов Windows SharePoint Services
Руководство здесь http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
предполагает, что
//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
using (SPWeb subweb = rootweb.Webs[i])
{
//do stuff
}
}
является предпочтительным решением этой проблемы.
Существует также инструмент, который вы можете запустить поверх своего решения, чтобы убедиться, что вы все делаете правильно. http://code.msdn.microsoft.com/SPDisposeCheck