在我的代码中,我有一个更改事件,我的代码的另一部分订阅了此事件。
问题是当我的更改事件被引发时,执行触发事件的方法是否暂停并且事件处理程序是否执行,或者是事件队列与操作系统一起并在下一次机会处理,这将是最常见的可能是在初始方法完成后?
此外,如果订阅者位于不同的线程中,此行为是否会更改?
在调试和单步执行代码时,代码会立即进入事件处理程序,就像方法调用一样,这不是我所期望的那样?
这是一个澄清我要问的例子:
Event Handler 1
{
{
//Code Section 1
}
//*Trigger My Event Here
{
//Code Section 2
}
}
Event Handler 2
{
}
我补充说代码本身实际上是另一个线程中触发的事件的事件处理程序。
此线程可以同时创建许多事件并将它们添加到队列中。当我在事件处理程序中间触发我自己的事件时,我的事件处理程序2会立即执行还是事件处理程序1的所有其他实例都会先完成?
答案 0 :(得分:1)
响应用户界面表面上的用户操作而生成的事件将放置在用户界面的消息队列中。
在UI线程上运行的消息泵按接收顺序执行这些消息。如果UI没有响应,因为UI线程上已经在处理了另一个事件,则新事件将被丢弃到消息队列中,直到消息泵可以到达它们。
如果从代码中的UI线程引发事件,则不会进入消息队列。它等同于方法调用;它会立即执行。
如果您使用Invoke()
或Control.Invoke()
在另一个线程上的UI线程上引发事件,则会获得put into the Message Queue,等待轮到。 System.Winforms.Timer
也会这样做。请注意,即使您从UI线程调用了事件,Control.BeginInvoke
总是总是将事件推送到消息队列中,而如果您从UI调用它,Control.Invoke
将立即执行线程(为了避免死锁)。