Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Руководство здесь http://www.sharepointdevwiki.com/display/public/ Когда + в + Dispose + SharePoint + объекты

предполагает, что

//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

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