// Добавить событие в список, add { int i;

for(i=0; i < 3; i++) if(evnt[i] == null) { evnt[i] = value; break;

}

if (i == 3) Console.WriteLine("Список событий заполнен.");

}

// Удалить событие из списка, remove { int i; for(i=0; i < 3; i++) if(evnt[i] == value) { evnt[i] = null; break;

}

Когда в цепочку событий добавляется обработчик событий, вызывается аксессорadd,и в первом неиспользуемом (т.е. пустом) элементе массиваevntзапоминается ссылка на этот обработчик, содержащаяся в неявно задаваемом параметреvalue.Если в массиве отсутствуют свободные элементы, то выдается сообщение об ошибке. (Разумеется, в реальном коде при переполнении списка лучше сгенерировать соответствующее исключение.) Массивevntсостоит всего из трех элементов, поэтому в нем можно сохранить только три обработчика событий. Когда же обработчик событий удаляется из цепочки событий, то вызывается аксессорremoveи в массивеevntосуществляется поиск ссылки на этот обработчик, передаваемой в качестве параметраvalue.Если ссылка найдена, то соответствующему элементу массива присваивается пустое значение(null),а значит, обработчик удаляется из цепочки событий.

При запуске события вызывается методOnSomeEvent(). В этом методе происходит циклическое обращение к элементам массиваevntдля вызова по очереди каждого обработчика событий.

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

ПРИМЕЧАНИЕ

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

Разнообразные возможности событий

Перейти на страницу:

Похожие книги