是否有可能GUI事件中断从GUI线程运行代码以执行其自己的事件处理程序方法?

时间:2010-05-05 07:08:09

标签: c# user-interface events interruption

我的GUI代码中有一种奇怪的行为。如果用户在短时间内产生大量事件,则会发生正在运行的事件处理程序方法被另一个事件处理程序方法中断的情况。 因为一切都在同一个线程(GUI线程)中运行,所以一切都应该顺序运行,不应该中断,或者我是否误解了什么?

感谢您的建议, ENY

2 个答案:

答案 0 :(得分:4)

不,那不会发生。你理解线程顺序运行是正确的。

GUI线程可以被中断,但只能运行不同的线程,它不会重新进入GUI线程来处理另一个事件。一个线程只有一个指令指针,因此只能在代码中的一个位置,它不能被自己中断。

如果您遇到的东西看起来像是重新输入了GUI线程,原因就在于此。

然后,GUI可以通过调用Application.DoEvents方法“中断”自身。

答案 1 :(得分:3)

你是对的,在单线程应用程序中,事件应该按顺序运行。有一些例外:

  1. 触发事件并调用其订户列表中的第一个事件处理程序。事件处理程序触发自己的事件,该事件调用其他事件处理程序。在这种情况下,事件似乎被中断,但事实并非如此。当原始事件处理程序完成时,将调用列表中的下一个事件处理程序。

  2. 事件处理程序调用{​​{1}}方法。这将暂停当前事件并处理在消息队列中等待的任何消息(通常会触发它们自己的事件),并且当它处理完所有消息后,它将返回到该事件。当Application.DoEvents()导致对调用它的事件进行递归调用时,可能会出现问题,因为从其处理的消息中触发了一个事件。

  3. 事件处理程序可以在不同的线程上执行。某些事件不会在UI线程上触发,并可能在自己的线程上触发。这可能导致事件在线程上下文切换时无序触发并相互中断。确保在UI线程上触发您使用的事件,如果没有,则将Application.DoEvents()它们放到UI线程上。 Control.Invoke()事件是在单独的线程上触发的事件的示例,可能是您不知道它。