Cómo: Declarar eventos que evitan que se pierda memoria

Actualización: noviembre 2007

Hay varias circunstancias en las que es importante que una aplicación mantenga un bajo uso de memoria. Los eventos personalizados permiten a la aplicación utilizar memoria sólo para los eventos que controla.

De manera predeterminada, cuando una clase declara un evento, el compilador asigna memoria para que un campo almacene información de eventos. Si una clase tiene muchos eventos no usados, ocupan memoria inútilmente.

En lugar de utilizar la implementación predeterminada de los eventos que Visual Basic proporciona, puede utilizar los eventos personalizados para administrar más cuidadosamente el uso de memoria.

Ejemplo

En este ejemplo, la clase utiliza una instancia de la clase EventHandlerList, almacenada en el campo Events, para guardar información sobre los eventos que están en uso. La clase EventHandlerList es una clase de lista optimizada diseñada para contener delegados.

Todos los eventos de la clase usan el campo Events para realizar un seguimiento de qué métodos está controlando cada evento.

Public Class MemoryOptimizedBaseControl
    ' Define a delegate store for all event handlers.
    Private Events As New System.ComponentModel.EventHandlerList

    ' Define the Click event to use the delegate store.
    Public Custom Event Click As EventHandler
        AddHandler(ByVal value As EventHandler)
            Events.AddHandler("ClickEvent", value)
        End AddHandler
        RemoveHandler(ByVal value As EventHandler)
            Events.RemoveHandler("ClickEvent", value)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            CType(Events("ClickEvent"), EventHandler).Invoke(sender, e)
        End RaiseEvent
    End Event

    ' Define the Click event to use the same delegate store.
    Public Custom Event DoubleClick As EventHandler
        AddHandler(ByVal value As EventHandler)
            Events.AddHandler("DoubleClickEvent", value)
        End AddHandler
        RemoveHandler(ByVal value As EventHandler)
            Events.RemoveHandler("DoubleClickEvent", value)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            CType(Events("DoubleClickEvent"), EventHandler).Invoke(sender, e)
        End RaiseEvent
    End Event

    ' Define additional events to use the same delegate store.
    ' ...
End Class

Vea también

Tareas

Cómo: Declarar eventos que evitan bloqueos

Referencia

Event (Instrucción)

EventHandlerList