Apache flex 分派事件是否会中断函数?

Apache flex 分派事件是否会中断函数?,apache-flex,flash,actionscript,flex3,Apache Flex,Flash,Actionscript,Flex3,假设函数foo()正在执行。假设发生了一个外部事件,您有一个处理程序。是否会中断函数foo(),以便执行事件处理程序?在这种情况下执行的顺序是什么?这实际上有点棘手 我真的不知道Flash在这方面是如何工作的,但在C#中有几个例子。我建议你仔细看看这些东西是怎么工作的。另一个好方法是插入调试器并检查导致事件处理程序的堆栈,以了解其含义 基本上有两种情况之一: 正如阿西克博士所说,您可以直接调用委托事件,这与同步调用方法完全相同。在本例中,关于线程上下文切换的常规规则适用,但实际上,事件没有特殊属

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

这实际上有点棘手

我真的不知道Flash在这方面是如何工作的,但在C#中有几个例子。我建议你仔细看看这些东西是怎么工作的。另一个好方法是插入调试器并检查导致事件处理程序的堆栈,以了解其含义

基本上有两种情况之一:

  • 正如阿西克博士所说,您可以直接调用委托事件,这与同步调用方法完全相同。在本例中,关于线程上下文切换的常规规则适用,但实际上,事件没有特殊属性。这只是一个函数调用

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

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

    但是,在案例2中还有另一个场景,其中foo()不在主UI线程上。在这种情况下,它完全可以被正常的上下文切换中断

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

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

    不,
    foo()
    不会被中断


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

    这是正确的,但让我澄清一下。Flash Player中的代码执行是单线程的。因此,Flex应用程序只在一个线程上运行。但是Flash Player中有一些东西是在不同的线程上运行的,比如网络IO,这样网络请求就不会阻塞UI。我恐怕这不是所有事件调度的情况。事件机制不是内在异步的。它归结为回调,真的。的确,玩家的API发送的大多数事件都是异步触发的,不过,就像用户手势、flash.net包等生成的事件一样。尽管如此,用户特定问题的答案仍然是“不,不会被中断”。在foo()完成之前,全新事件的用户事件处理程序仍然不会执行。我不同意。尝试调度事件,您将看到在执行foo时将调用处理程序。私有函数测试():void{var dispatcher:EventDispatcher=new EventDispatcher();dispatcher.addEventListener(Event.COMPLETE,function(e:Event):void{trace(“handleComplete”);};dispatcher.dispatchEvent(new Event(Event.COMPLETE));trace(“测试的最后一行”);}你的例子是正确的-我的评论没有完全传达我的主张。如果触发了某个外部事件(如原始问题所述),则我认为在当前例程完成之前不会处理该事件。如果foo()本身触发了一个事件,那么流将按照您所描述的方式进行—事件将立即在单个(主)线程上处理。我承认这是值得核实的。创建一个示例应用程序来试用它是非常简单的;如果我今天晚些时候有时间,我会这样做。这里有另一个“线程”是关于运行在单个线程中的Flex应用程序的:-James与问题无关。这个问题是针对flash播放器的。@bug-a-lot。但所描述的模型适用于flash播放器。