我有以下课程
儿童班:
public class ChildClass
{
...
private void EventHandler(...);
...
}
家长班:
public class ParentClass
{
...
ChildClass child;
...
private void EventHandler(...);
...
}
他们都在同一事件上有一个事件处理程序。
问题是这些处理程序的调用顺序是什么?
答案 0 :(得分:6)
重要提示
Servy非常正确地pointed out我们不能排除有关事件由第三方拥有并且它实现accessors本身的可能性。如果是这样的话,那么所有的赌注都会被取消。
下面的原始答案默默地假设我们正在谈论一个标准的,完全无趣的事件实现。
原始回答
事件通过delegates实施。
来自MSDN:
委托对象的一个有用属性是多个对象可以 使用+运算符分配给一个委托实例。该 多播委托包含已分配的委托的列表。当。。。的时候 调用多播委托,它调用列表中的委托 顺序。
因此,按照将它们添加到事件的顺序调用处理程序。
答案 1 :(得分:3)
代表订阅的顺序,虽然因为在规范中我没有正确地注明(我知道)这是预期的行为,特别是那么依赖这样的顺序可能是愚蠢的,因为它可能会因实施而改变。
答案 2 :(得分:3)
它将按照注册顺序调用。
答案 3 :(得分:3)
虽然MSDN文档明确指出多播委托按照订阅顺序调用委托,但假定订阅顺序是确定性的,即您处于单线程环境中。
如果不是这种情况,最好定义两个事件:BeforeEventOccurs事件和AfterEventOccurs事件。即使在多线程环境中,这也可以确保对订单进行控制。
答案 4 :(得分:2)
根据this question事件处理程序按照订阅事件的顺序调用。
答案 5 :(得分:1)
来自 Delegates
委托用于将方法作为参数传递给其他方法。 事件处理程序只不过是通过调用的方法 代表即可。您可以创建自定义方法和类,例如窗口 当某个事件发生时,control可以调用你的方法。
来自 How to: Combine Delegates (Multicast Delegates) 页面;
委托对象的一个有用属性是多个对象可以 使用+运算符分配给一个委托实例。该 多播委托包含已分配的委托的列表。当。。。的时候 调用多播委托,它调用列表中的委托, in 为了强>