2013-05-28 2 views
1

Мне просто интересно, как именно .Net framework обрабатывает события.Если событие срабатывает, и никто не слушает, это делает звук?

Предположительно, когда происходит событие, все зарегистрированные обработчики вызываются (на новые потоки?). Если нет обработчиков, как далеко проходит обработка событий? Есть ли внутренний флаг «Нет слушателей», чтобы предотвратить потраченные впустую циклы?

Вопрос возникает, когда я размышлял над огромным количеством неиспользуемых событий, генерируемых сложными формами (особенно WPF). Ввод/выключение мыши/и т. Д.

ответ

4

События не работают.

Что касается CLR, событие - это всего лишь пара методов с именем add_EventName и remove_EventName. (они называются аксессуарами, как свойства)

Как реализовать эти методы и вызвать обработчики до классов реализации.

Как правило, события реализуются путем хранения всех обработчиков для каждого события в делете многоадресной рассылки (либо в генерируемом компилятором поле поддержки из неявного события, либо как-то вроде EventHandlerList).

Вызов многоадресного делегата будет запускать каждый метод синхронно, в порядке ввода.
Если методов нет, он будет равен нулю. (нет такого экземпляра, как пустой экземпляр делегата многоадресной рассылки)

+1

+1. И чтобы ответить на один из вопросов, поставленных более непосредственно - когда никто не подписался на событие, его значение равно «null», поэтому проверка должна выполняться или иначе вызывается «NullReferenceException». Итак, есть флаг, в котором говорится, что «нет слушателей», который является «this.MyEvent == null». –

1

События реализованы с делегатом многоадресной передачи, который равен null, когда с ним не связаны обработчики. В коде CLR, который реагирует на события, вы увидите что-то вроде этого:

void OnEventName(EventNameArgs e) 
{ 
    // Only invoke the delegate if there are handlers associated with it 
    if (EventNameDelegate != null) 
    { 
     EventNameDelegate(sender, e); 
    } 
} 

См How to: Implement Events in Your Class примеров. Таким образом, события обычно реализуются в .NET, в том числе в коде библиотеки.

+0

Обратите внимание, что это не потокобезопасное. – SLaks

Смежные вопросы