Каковы опасность утилизации SPWEB, когда он автоматически утилизируется?

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/42296

Вопрос

в некоторых случаях, таких как:

using (SPSite site = new SPSite(@"http://sitecollection/"))
{
    SPWeb web = site.RootWeb;
}
.

Вам не нужно распоряжаться объектом SPWEB, потому что он утилизируется автоматически с помощью сборщика мусора.То же самое с spitemeventproperties, e.g.

    private static void ItemUpdated(SPItemEventProperties properties)
    {
        SPWeb web = properties.Web;     
    }
.

Каковы опасности утилизации этих объектов SPWEB, когда они уже автоматически утилизируются?Это было так настроено на всегда Утилизируйте объекты SPWEB, которые в некоторых из моих более старого кода я утилизировал объект SPWEB, возвращенный из site.RootWeb или properties.web

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

Решение

В первом примере нет проблем с утилизацией SPWEB, потому что вы уверены, что никто не будет использовать его позже.

Во втором примере вы запускаете риск утечки памяти или сбой, если есть какой-либо приемник событий с более высокой последовательностью в том же списке / типах контента.Другой приемник событий, вероятно, попытается использовать веб-сайту, которая была расположена, SharePoint будет пытаться оживить веб, но может выйти из строя / должен создать новый SPWEB в зависимости от состояния сборки мусора.

Так что, если вы не создали SPSITE / SPWEB (SPCONTEXT.CURRENT, ASEPENTPROPERTIES, ...) Тогда вы не должны освободить его (если вы не должны свышены SPLIMITEDWEBPARTMANAGER.WEB)

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

В общем, вы должны распоряжаться только объектом, который вы создаете.

using (SPSite site = new SPSite(@"http://sitecollection/"))       
{           
    SPWeb web = site.RootWeb;       
}
.

в примере 1, инстантор - это вы.Разве не имеет значения, если вы призываете распоряжаться в середине вашего кода (до тех пор, пока объект больше не нужен) или подождите, пока он пока не будет автоматически избавлен в конце использования Bloodlet.

private static void ItemUpdated(SPItemEventProperties properties)       
{
    SPWeb web = properties.Web; 
}   
.

В Примере 2 Вы просто ссылаетесь на его существующий объект, поэтому ее не рекомендуется ее распоряжаться, потому что может быть, может быть в диапазоне (ваш приемник событий) все еще нуждается в этом.Что происходит, если вы уничтожили объект, который вы не принадлежите?

Единственная реальная «опасность» состоит в том, что вы приведуте API для восстановления метаданных для этого объекта. В зависимости от вашего кода, ваш контекст и объекты SPWEB / SPSite, это может потенциально может быть большой удар производительности и, следовательно, значительный недостаток.

Вы не будете вызывать исключения или жесткие ошибки, утилизируя слишком рано или слишком поздно, это только запутается только механизмы кэширования SharePoint.

Некоторые ссылки:

Я бы порекомендовал установить и использовать SPDisPosecheck, если вы еще этого не сделали;Я знаю, что я постепенно бегу на более старые и старые биты кода и должен исправить проблемы.

Правила, упомянутые выше большого пальца - если вы не создали его, вы не должны распоряжаться этим.

Обратите внимание, что с SPDISPOSECHECK SPDWEB свойство проблематично - это предупреждает вас, если вы не распорядитеся в Интернете, и он предупреждает вас, если вы сделаете .Это ошибка.Правда в том, что вам не нужно распоряжаться этим, утилизация SPSITE избавится от него.

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