Smaltimento di oggetti in un ricevitore di eventi
-
16-10-2019 - |
Domanda
Ho un ricevitore di eventi ItemUpdated
in esecuzione su una libreria. Una logica piuttosto semplice. Ecco l'essenza di quello che sto facendo:
SPWeb web = properties.Web;
SPContentTypeId ParentCT_Id = web.AvailableContentTypes["Some Content Type"].Id;
if (ParentCT_Id != null)
{
if (properties.ListItem.ContentTypeId.IsChildOf(ParentCT_Id))
{
if (properties.ListItem[RECORD_END_DATE] != null)
{
SPListItem item = properties.ListItem;
item.File.CheckOut();
DateTime endDate = (DateTime)item[RECORD_END_DATE];
item[RECORD_YEAR_END_DATE] = string.Format("12/31/{0}", endDate.Year.ToString());
item.UpdateOverwriteVersion();
item.File.CheckIn(RECORD_YEAR_END_DATE + " has been updated");
}
}
}
Mi chiedo se ho bisogno di essere lo smaltimento mio oggetto web
qui che ho creato. Ottengo 6 voci nel registro ULS:
An SPRequest object was not disposed before the end of this thread. To avoid wasting system resources, dispose of this object or its parent (such as an SPSite or SPWeb) as soon as you are done using it. This object will now be disposed.
Come dovrebbe SPWeb oggetti essere smaltito in un ricevitore di eventi, se non del tutto? Ho anche provato a mettere web.Dispose()
alla fine, ma le voci mostrano ancora in piedi.
Modifica 1
ho detto che ci sono 6 voci nei registri, e credo che corrisponde al numero di punti di rottura mi ha colpito. Non tutti 6 di questi sarebbe fare al blocco di codice di cui sopra a causa di una certa logica. Non hanno mai un'istanza di un oggetto SPWeb
.
Soluzione
Assicurati, si disattiva il fireing evento nella vostra ricevitore di eventi. In caso contrario, l'evento verrà generato ogni volta che si chiama item.UpdateOverwriteVersion. La perdita di memoria potrebbe verificarsi quando SharePoint ferma questa ricorsione.