调度事件是否会中断函数?

5 apache-flex flash actionscript flex3

假设函数foo()正在执行.假设发生了一个外部事件,你有一个处理程序.函数foo()会被中断,以便可以执行事件处理程序吗?在这种情况下执行的顺序是什么?

Mat*_*ard 5

不,foo()不会被打断.

Flex是单线程的,因此foo()将继续运行.一旦foo()完成并且控制返回到事件循环,那么将处理事件队列中的第一个事件.


ric*_*ice 1

这实际上可能有点棘手。

我真的不知道Flash在这方面是如何工作的,但是例如在C#中有一些情况。我建议你阅读一下这个东西是如何工作的。同样好的方法是中断调试器并检查导致事件处理程序的堆栈以了解它。

基本上有两种情况之一正在发生:

  1. 正如 Dr_Asik 所说,您可以直接调用委托事件,这与同步调用方法完全相同。在这种情况下,有关线程上下文切换的正常规则适用,但事件实际上没有特殊属性。这只是一个函数调用。

  2. 您可能正在谈论 UI 表单事件。在这种情况下,一些特殊规则确实适用。UI 事件被“发布”到事件队列,而不是同步执行。因此,如果 foo() 位于“主”UI 线程上,则用户在 foo() 运行时按下某个键,则该按键将被操作系统捕获并发布到应用程序的 UI 事件队列。但 foo() 已经在运行,因此主线程不会停止并检查该队列。只有当 foo() 的整个调用堆栈完成一直返回到消息队列检查循环时,主线程才会找到该消息、处理它并调用其处理程序。

需要明确的是,在最后一种情况下 foo() 保证不会被 UI 事件中断。

但是,在情况 2 中,还有另一种情况,其中 foo() 不在主 UI 线程上。在这种情况下,它绝对可以通过正常的上下文切换来中断。

在 C# 中,如果您开始使用 Control.Invoke(),事情会变得更加棘手。

这不是 Flash 特定的,但我希望它能有所帮助。我怀疑 Flash 有一个带有事件队列和处理循环的主线程,就像 C# 一样。这是至少在 C#、Java 和 Delphi 中都可以找到的常见模型。