Практическое руководство. Объявление событий, которые экономят использование памяти

Обновлен: Ноябрь 2007

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

По умолчанию, когда класс объявляет событие, компилятор выделяет память под поле для хранения сведений события. Если класс имеет много неиспользуемых событий, они занимают много памяти.

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

Пример

В этом примере класс использует один экземпляр класса EventHandlerList, хранящийся в поле Events, для хранения сведений о используемых событиях. Класс EventHandlerList является оптимизированным списочным классом, созданным для хранения делегатов.

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

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

См. также

Задачи

Практическое руководство. Объявление события, исключающего блокирование

Ссылки

Оператор Event

EventHandlerList