我只是想知道.Net 框架究竟是如何处理事件的。
大概当一个事件触发时,所有注册的处理程序都会被调用(在新线程上?)。如果没有附加处理程序,事件处理能走多远?是否有内部“没有侦听器”标志来防止浪费周期?
当我在思考由复杂表单(尤其是 WPF)生成的大量未使用事件时,问题就来了。所有鼠标进入/退出/等。
我只是想知道.Net 框架究竟是如何处理事件的。
大概当一个事件触发时,所有注册的处理程序都会被调用(在新线程上?)。如果没有附加处理程序,事件处理能走多远?是否有内部“没有侦听器”标志来防止浪费周期?
当我在思考由复杂表单(尤其是 WPF)生成的大量未使用事件时,问题就来了。所有鼠标进入/退出/等。
事件不是那样工作的。
就 CLR 而言,事件只是一对名为add_EventName
and的方法remove_EventName
。(这些被称为访问器,就像属性一样)
如何实现这些方法和调用处理程序取决于实现类。
通常,事件是通过将每个事件的所有处理程序存储在多播委托中来实现的(在编译器生成的隐式事件的支持字段中,或类似的东西中EventHandlerList
)。
调用多播委托将按插入顺序同步运行每个方法。
如果没有方法,它将为空。(没有空的多播委托实例这样的东西)
事件是通过多播委托实现的,即null
没有与之关联的处理程序。在响应事件的 CLR 代码中,您将看到如下内容:
void OnEventName(EventNameArgs e)
{
// Only invoke the delegate if there are handlers associated with it
if (EventNameDelegate != null)
{
EventNameDelegate(sender, e);
}
}
有关示例,请参见如何:在您的类中实现事件。这就是事件通常在 .NET 中实现的方式,包括在库代码中。