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