Share via


Procedimientos recomendados con receptores de eventos

Última modificación: miércoles, 13 de enero de 2010

Hace referencia a: SharePoint Foundation 2010

En este tema se tratan problemas comunes relacionados con el uso eficiente de receptores de eventos.

Mediante objetos en receptores de eventos

No cree instancias de un objeto SPWeb, SPSite, SPList o SPListItem dentro de un receptor de eventos. Los receptores de eventos que crean instancias de estos objetos en lugar de usar las instancias que se pasan a través de las propiedades del evento pueden ocasionar los siguientes problemas:

  • Importantes idas y vueltas adicionales a la base de datos (una operación de escritura puede provocar hasta cinco recorridos de ida y vuelta adicionales en cada receptor de eventos).

  • Las llamadas al método Update en estas instancias pueden ocasionar que las llamadas posteriores a Update en otros receptores de eventos registrados sean erróneas.

Procedimiento no recomendado de codificación

Creación de una instancia de un objeto SPSite dentro de un receptor de eventos

public override void ItemDeleting(SPItemEventProperties properties)
{
    using (SPSite site = new SPSite(properties.WebUrl))
    {
    using (SPWeb web = site.OpenWeb())
        {
        SPList list = web.Lists[properties.ListId];
        SPListItem item = list.GetItemByUniqueId(properties.ListItemId);
        // Operate on an item.
        }
    }
}
 Public Overrides Sub ItemDeleting(ByVal properties As SPItemEventProperties)
    Using site As New SPSite(properties.WebUrl)

        Using web As SPWeb = site.OpenWeb()
            Dim list As SPList = web.Lists(properties.ListId)
            Dim item As SPListItem = list.GetItemByUniqueId(properties.ListItemId)
            ' Operate on an item.
        End Using
    End Using
End Sub

Procedimiento recomendado de codificación

Mediante SPItemEventProperties

// Retrieve SPWeb and SPListItem from SPItemEventProperties instead of
// from a new instance of SPSite.
SPWeb web = properties.OpenWeb();
// Operate on the SPWeb object.
SPListItem item = properties.ListItem;
// Operate on an item.
' Retrieve SPWeb and SPListItem from SPItemEventProperties instead of
' from a new instance of SPSite.
Dim web As SPWeb = properties.OpenWeb()
' Operate on the SPWeb object.
Dim item As SPListItem = properties.ListItem
' Operate on an item.

Si no recupera los objetos SPWeb, SPSite, SPList o SPListItem desde SPItemEventProperties, sino que crea instancias de dichos objetos dentro de un receptor de eventos, cuando llame a Update en las nuevas instancias, deberá desactivarlo con el método Invalidate en la clase secundaria correspondiente de SPEventPropertiesBase (por ejemplo, SPItemEventProperties.InvalidateListItem o SPItemEventProperties.InvalidateWeb).