【问题标题】:Race condition firing events in AS3AS3 中的竞争条件触发事件
【发布时间】:2010-12-22 12:21:25
【问题描述】:

我在以正确的编年史顺序触发和删除事件时遇到了一些麻烦。下面的代码给出了以下输出:

  • 将海报保存到数据库中,并发送事件
  • 调用服务,调度事件已移除 = false
  • 调用服务,调度事件已移除 = false
  • 调用服务,调度事件已移除 = true
  • 将海报保存到数据库中,并发送事件
  • 将海报保存到数据库中,并发送事件

当然这应该更像是:

  • 将海报保存到数据库中,并发送事件
  • 调用服务,已移除调度事件 = true
  • 将海报保存到数据库中,并发送事件
  • 调用服务,已移除调度事件 = true
  • 将海报保存到数据库中,并发送事件
  • 调用服务,调度事件已移除 = true

有人可以帮我解决这个问题吗?我对如何解决这个问题没有任何想法。

谢谢!

    for(var i:int = 0;i< 3;i++){
        createPoster();         
    }

    function createPoster(){
        Main.db.savePoster();
        Main.db.addEventListener(Config.evt_SAVEPOSTER_READY, callService);
    }

    function callService(){
       Main.db.removeEventListener(Config.evt_SAVEPOSTER_READY, callService);
    }

【问题讨论】:

    标签: flash actionscript-3 events race-condition


    【解决方案1】:

    db 调用 (Main.db.savePoster();) 是否同步 - 是否仅在操作完成后返回?由于您在 db 调用之后调用 addEventListener,因此如果 db-call 是同步的,则不会调用事件侦听器(至少对于第一次迭代)。

    Main.db 在所有三个迭代中都是同一个实例吗?如果是,您不必为它注册相同的事件侦听器三次 - 一次就足够了。在开始 for 循环之前调用 addEventListener。保留一个计数器来跟踪对 callService 的调用次数,并在计数器达到循环计数(在本例中为 3)时调用 removeEventListener

    【讨论】:

      【解决方案2】:

      问题是您在单个EvenDispatcher objectdb 上为同一事件Config.evt_SAVEPOSTER_READY 注册相同的函数callService。因此,在成功保存海报后,一旦第一次 savePoster 调度事件,db 就会接收到该事件并调用三个 eventHandler(在本例中为 callService),因为 callService 注册了三次。因此,一种解决方案是从 Poster 调度事件。

      for(var i:int = 0;i< 3;i++){
        createPoster();
      }
      function createPoster(){
        poster = Main.db.savePoster();
        poster.addEventListener(Config.evt_SAVEPOSTER_READY, callService);
      }
      function callService(e:PosterEvent){
        e.target.removeEventListener(Config.evt_SAVEPOSTER_READY, callService);
      }

      【讨论】:

      • 嗯,好点。我会实施它并回到它。谢谢有用的回复!
      【解决方案3】:

      您是否检查过仅循环遍历一项时会发生什么?在我看来,你没有正确地排队你的例程。

      您可能只想向 Main.db 对象添加一次事件侦听器,并在成功保存所有“海报”后将其删除。

      【讨论】:

      • 您好,谢谢您的回复。是的,我做到了,循环一次时没有问题。我在 for 循环中放置了一个计时器,如果我每 1000 毫秒触发一次 createPoster,那么就没有问题。似乎 for 循环会加快事件的删除速度。
      • 添加延迟来解决问题是一个弱策略。稍后我可能会发布一些示例代码来解释我的上述观点。
      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 2023-01-10
      • 2012-07-12
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2015-09-10
      • 2016-11-16
      相关资源
      最近更新 更多