2

当我在 .NET 中引发事件时,/技术上/到底发生了什么?我无法通过 Google 自己回答这个问题。

我的意思不是:事件被引发并且突然某个处理程序被调用,我的意思是两者之间发生了什么?事件是否以某种方式存储在不可见的事件堆栈中?他们在某个地方排队吗?我可以发起多少事件?等等

我希望有人能对 .NET 虚拟机如何处理事件有所了解。

4

1 回答 1

4

常规 .NET 事件通常只是委托调用,与常规方法调用没有太大区别。唯一细微的区别是,因为委托是多播的,它必须展开所有订阅者的完整调用列表,然后依次调用它们。这一切都发生在委托期间.Invoke()。所以不,没有特殊的事件堆栈/队列。

然而!UI 技术(winforms、WPF 等)上的一些东西确实使用了 Windows 消息循环——所以在这些情况下,是的,有一个逻辑队列。

每个委托订阅(即foo.SomeEvent += this.SomeHandler)涉及两件事:一个目标实例(this)和一个目标方法(SomeHandler)。调用时,委托只是针对指定目标调用方法。有点神奇,但与常规方法调用没有什么不同。

于 2013-09-20T08:10:11.103 回答