Утилизация SharePoint SPSite - PullRequest
4 голосов
/ 17 июня 2009

Сценарий, который у меня есть, находится в методе выполнения SPJobDefinition. Я хочу пройти через каждый SPSite в веб-приложении. Итак, у меня есть следующий код:

foreach (SPSite site in this.WebApplication.Sites)
{
  ...
}

Вопрос в том, нужно ли распоряжаться каждым сайтом? Правило, которым я обычно придерживаюсь, - это распоряжаться или помещать в использование, только если я сам его обновляю. Будет ли свойство Sites фактически содержать полностью сконструированные объекты сайта, на которые я буду ссылаться только в этом коде. Если так, то удаление сайтов будет опасным, так как я изменяю другой объект, который может их захотеть. Или наоборот: свойство Sites создает объекты по запросу ... в каком случае я отвечаю за их удаление?

Плюс, как мне распоряжаться ими, если мне нужно это сделать. Я не могу использовать использование в этом случае, и вызовет ли распоряжение внутри foreach нарушить перечисление?

Ответы [ 3 ]

15 голосов
/ 17 июня 2009

Да, вы делаете.См. «Написание приложений, которые масштабируются до большого числа пользователей» в Рекомендации: общие проблемы кодирования при использовании объектной модели SharePoint .Правильный шаблон:

foreach (SPSite site in this.WebApplication.Sites)
{
  try
  {
    ...
  }
  finally
  {
    site.Dispose();
  }
}

Вызов утилизации не нарушит перечисление.Он просто очищает неуправляемую память, используемую объектом.

0 голосов
/ 26 июня 2009
0 голосов
/ 18 июня 2009

Руководство здесь 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...