Утилизация и закрытие объектов SPWEB
Вопрос
Я использовал что -то вроде
using (SPWeb web = SPControl.GetContextWeb(Context))
Но при развертывании проекта он показывает ошибку. Пытаясь выяснить причину, которую я наткнулся на статью MSDN:
который гласит это:
Не используйте метод распоряжения или закрытия класса SPWEB, чтобы закрыть объект, возвращаемый с помощью метода GetContextWeb. Вместо этого пусть Windows SharePoint Services или ваше портальное приложение управляют объектом.
Я новичок в SharePoint, может ли кто -нибудь объяснить мне причину этого?
Решение
Если вы получите SPWEB от контекста, он был создан в другом месте, и что в другом месте разрушит его для вас.
Если вы уничтожаете (утилизируете) это слишком рано, когда страница придет, чтобы распоряжаться ее, она, скорее всего, будет паникой, и некоторые данные, используемые для создания страницы, вероятно, будут потеряны.
Правило пальца - если вы используете spsite.openweb () или иным образом используете новый spweb (), то вы должны избавиться от него сами (или включить в заявление об использовании). Это в равной степени относится к сети, полученной через SPWEBCollection (например, spweb.webs, spsite.allwebs или spweb.getsubwebsforcurrentuser ()).
Другие советы
А Dispose()
Метод, если IDisposal
Интерфейс - это интерфейс Specifc, который используется, когда объекты блокируют тяжелые и дорогие ресурсы. Например, когда вы приобретаете соединение с базой данных. Метод распоряжения должен сообщить объекту, что я сделал с соединением (в случае SQL), и что вы теперь можете закрыть его и позволить кому -то другому использовать ресурс. В .NET все записано в управляемом коде и автоматически собирается мусор, тогда как соединения SQL и объекты COM+ не выпускаются автоматически.
В случае SharePoint это было обсуждение (уже много лет) о том, когда и как утилизировать объекты. Джеймс хорошо объясняет это с помощью эмпирического правила. Причина, по которой вам необходимо позвонить в утилизацию в некоторых случаях, заключается в том, что SharePoint использует не управляемый код (com+) в SPSite
а также SPWeb
Объекты, например, сделать вызовы базы данных. Если объекты не утилизируются должным образом, у вас в конечном итоге закончится память, так как сборщик мусора в .NET не может автоматически отпустить объекты «внешний» (до .NET).
В вашем случае вы должны нет использовать using
оператор, так как он автоматически утилизирует объект. Заявление об использовании расширяется как это в компиляторе, из
using (SPWeb web = SPControl.GetContextWeb(Context)) {
...
}
к этому:
try (SPWeb web = SPControl.GetContextWeb(Context)) {
...
}
finally {
web.Dispose();
}
Я тоже ускоряюсь с развитием SharePoint и нашел Утилизировать закономерности по примеру быть отличным ссылком по этому вопросу. Надеюсь, это поможет вам так же сильно, как и мне.
Если вы сомневаетесь в том, правильно ли вы обращаетесь с распоряжением, у Microsoft есть Spdisposecheck Tool Доступен, чтобы проверить это для вас. Вы можете запустить это вручную, непосредственно из Visual Studio или даже включить его в проверку на вашем сервере сборки.