我是否需要担心Flex / AIR代码中的并发问题?

时间:2009-01-10 01:36:09

标签: flex actionscript air

我有一种情况,我正在启动一些对象,当它们准备好处理一些输入数据时,调用一个处理程序。

该处理程序从待处理请求的ArrayCollection中获取数据集,将其分配给对象,并从ArrayCollection中删除数据集。

(我不能从ArrayCollection弹出,因为我需要搜索它以找到一个合适的数据集 - 它并不总是最顶层的。)

两个对象是否有可能以这样的方式调用我的处理程序:(1)第一个被分配数据集;(2)第二个被分配相同的数据集,然后服务于第一个的处理程序的实例删除了它我猜(3)尝试从ArrayCollection中删除数据集时的第二个处理程序错误实例。

我对Flash Player运行时不熟悉,知道这种故障情况是否可行,或者我是否应该花些额外时间来设置某种锁定以防止它出现。


编辑:到目前为止,答案为Flex提供了热烈的评论,但我不确定他们是否回答了这个问题。要清楚,我不是要决定是否使用Flex。

如果我有一个方法:

  1. 从ArrayCollection中的某处获取一段数据
  2. 使用该数据执行某些操作
  3. 从ArrayCollection
  4. 中删除该数据

    在第一次调用#1之后但在#3之前,是否有可能另一次调用同一方法#1?

    le dorfier,你说Flex / AS“正常” - 你能澄清它在这种情况下会“正常工作”吗?

3 个答案:

答案 0 :(得分:8)

您不需要进行锁定,但您可能希望跟踪对州的修改顺序。正在播放的不同异步调用可以按照与发出异步调用时不同的顺序返回和修改模型状态。

Flex和AIR应用程序具有单线程编程模型。但是,它们的体系结构依赖于异步I / O来与服务器层进行交互。

现在,在Java Swing应用程序或.NET Winforms应用程序中,可以在后台线程上进行i / o交互,并在主GUI线程中编组参数/结果。 (这些图形UI库不允许其他线程更改图形工具包对象/窗口小部件的状态,因此必须将数据交互与其他后台处理线程进行封送处理。)

相比之下,Flex和AIR的i / o类库是在这些类异步实现i / o操作的地方编写的。例如,要执行HTTP GET,可以调用HttpSerivce send()方法,这不是阻塞调用。相反,只要调用最终完成并返回,就可以提供ActionScript3闭包来处理结果。

与此同时,Flex / AIR应用程序可以允许GUI继续与用户完全交互。它甚至可以显示进度指示器和/或取消按钮。

事实证明,尽管Flex / AIR单线程GUI模型比多线程Java Swing或.NET Winform应用程序更简单,更易于编程,但它具有与那些相同的复杂UI行为。富客户端应用程序的风格。

简单的事件驱动单线程GUI,异步i / o(通过服务调用和/或消息传递),再加上用于处理结果或故障的ActionScript3闭包,是Flex / AIR世界统治的秘诀。 (当然,作为这个世界征服策略的一部分,我应该提到对属性,事件和良好的声明性 - 或命令式 - 数据绑定的良好支持。)

答案 1 :(得分:2)

正如你所描述的那样,你的问题的答案是否定的。虽然了解事件注册,事件调度,优先级,异步等等都是有价值的,但事实上你仍然在主线程上的单个函数范围内修改ArrayCollection的工作,后面跟着该函数的第二次调用,也在主线程上 - 所以你在并发方面没有什么可担心的:虽然你可能不知道哪个对象首先到达那里(由于很多原因),你可以确定第二个将获得第一个工作的产品。

所以不,你很高兴。摇滚!

答案 2 :(得分:1)

将自己埋在Flex和Actionscript中几个月之后,我又回到了.NET;而且我有点被我必须选择的各种模式重新淹没 - 或者,我必须选择和协调。

相比之下,Flex / AIR有几个简单但完整的SDK调用数据和文件操作,每个调用都有同步和异步变体。它更容易理解和使用。

罗杰从我的经历中得到了正确的答案。 Flex / AS#Just Works。 .NET,逐渐减少(从选项超载,恕我直言)。一个结果是.NET更好地适应了边缘场景;但如果Flex / AS3可以满足您的要求,它可能很容易实现。想想80/20规则(或者可能更好。)

我认为罗杰已经解决了你的问题,但让我按照我认为的方式说出来。

您的方法在公共UI线程上是单线程的(以及其他UI活动)。但是资源(文件,dbms端口等)通常会通过一个简单的序列,您通常会这样设置:

  1. 实例化所需资源类的对象
  2. 在对象上注册返回事件的事件处理程序(比如“fileonOpen”),
  3. 调用对象的异步执行方法(例如“file.open”)。
  4. UI事件循环继续,
  5. 资源最终完成其方法执行,并触发您注册的事件处理程序,该事件处理程序现在在UI线程上运行。也许您的问题的答案是事件处理程序被赋予一个参数,它是与之相关的对象,所以你可以从你的收藏中删除它。据推测,你的对象足够自我识别,以防止在处理它所属的集合时产生混淆。如果它是数据库结果行,则可能知道它自己的PK值。文件对象具有nativePath,isDirectory,parent(另一个File对象)等属性