Иллюстрированный самоучитель по Architecture .NET

События

События представляют собой механизм, посредством которого объект имеет возможность получать информацию о происходящем вне него. Событие может быть вызвано неким действием пользователя, например, нажатием кнопки мыши, или некими изменениями состояния приложений, например, приостановкой или завершением задачи. Объект, генерирующий событие, называется источником или отправителем события, объект, который реагирует на событие, называется приемником или получателем события.

В обычном C++ для работы с событиями реализуют функции обратного вызова, для выполнения которых используются указатели на функции. В модели компонентных объектов Microsoft (COM) для работы с событиями используются интерфейсы IConnec-tionPomt и IConnectionPointContainer. В NET используются управляемые события. Все эти подходы по сути одинаковы, так что для их объединения Microsoft предложила Унифицированную модель событий (Unified Event Model).

Для поддержки этой новой Унифицированной модели событий в C++ введены новые ключевые слова _event (событие), _hook (привязать) и _unhook (отцепить), а также атрибуты event_source (источник события) и event_receiver (приемник события)

Ключевое слово _event (событие) используется для описания события, которое может быть сгенерировано источником события. Это слово можно использовать не только в управляемых классах, оно может применяться к следующим объявлениям:

  1. Описание метода класса обычного C++ (обычный обратный вызов)
  2. Описание интерфейса модели компонентных объектов Microsoft (COM) (точка стыковки)
  3. Описание метода управляемого класса (управляемое событие)
  4. Описание элемента данных управляемого класса (управляемое событие с использованием делегата)

Мы рассмотрим только третий случай, т е случай, в котором источником события является метод управляемого класса. Для того чтобы объявить обработчиком какого-то события метод класса-получателя этого события, используется ключевое слово _hook (привязать). После того, как это сделано, при каждом возникновении события будет вызываться его обработчик А чтобы такое объявление метода аннулировать, используется ключевое слово _unhook (отцепить).

В следующем примере демонстрируется использование ключевых слов _event (событие), _hook (привязать) и _unhook (отцепить), а также атрибутов event_source (источник события) и event_receiver (приемник события) для реализации механизма обратного вызова.

//Event.cpp
fusing <mscorlib.dll>
using namespace System;
// использовать пространство имен Система,
[event_source(managed)] // управляемый
public _gc class ManagedEventSource
// класс сборщика мусора ManagedEventSource
{ public:
_event void ManagedEvent(}; // нет реализации
void Fire_ManagedEvent()
{
ManagedEvent();
}
};
[event_receiver(managed)] // управляемый
gc class ManagedEventReceiver // класс сборщика мусора ManagedEventReceiver
{
public:
void HandleManagedEvent() // вызывается через ManagedEvent
{
Console::WriteLine("HandleManagedEvent called");
}
void HookEvent(ManagedEventSource *pEventSource)
{
_hook(// обработчик
SManagedEventSource::ManagedEvent,
pEventSource,
SManagedEventReceiver.:HandleManagedEvent),
}
void UnhookEvent(ManagedEventSource* pEventSource)
{
_unhook(// отцепиться
&ManagedEventSourсе::ManagedEvent,
pEventSource,
SManagedEventReceiver:HandleManagedEvent); }
};
void main ()
{
ManagedEventSource* pEventSource =
new ManagedEventSource;
ManagedEventReceiver* pReceiver =
new ManagedEventReceiver;
pReceiver › HookEvent(pEventSource);
pEventSource › Fire_ManagedEvent(); // вызывается обработчик
pReceiver › UnhookEvent(pEventSource);
}

Программа напечатает:

HandleManagedEvent called
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.