2009-01-10 96 views
4

我有一种情况,我开始了一些对象,当它们准备好处理一些输入数据时,调用一个处理程序。我需要担心Flex/AIR代码中的并发问题吗?

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

(我不能从ArrayCollection的,因为我需要通过它来搜索,找到一个合适的数据集流行 - 这是不是总在最前面的那一个)

难道两个对象可以打电话给我(1)第一个被分配一个数据集,(2)第二个被分配相同的数据集,然后服务于第一个的处理程序的实例已经删除了它,我猜(3)处理程序的第二个实例尝试从ArrayCollection中删除数据集时发生错误。

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


编辑:到目前为止的答案给Flex的发光评论,但我不知道他们回答这个问题。要清楚,我不想决定是否使用Flex。

如果我有一个方法:

  1. 获取一块从某处的数据在ArrayCollection
  2. 做一些事的数据
  3. 删除从ArrayCollection的数据

在第一次调用#1之后但是在#3之前,是否有可能再次调用同一个方法可以执行#1?你说Flex/AS“正常工作” - 你能否澄清一下,在这种情况下它会“正常工作”吗?

回答

8

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

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

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

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

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

因此,事实证明即使Flex/AIR单线程GUI模型比多线程Java Swing或.NET Winform应用程序更简单也更容易编程,它仍然具有与那些富客户端应用程序的风格。用于处理结果或故障的简单事件驱动单线程GUI,异步I/O(通过服务调用和/或消息传递),以及用于处理结果或故障的ActionScript3闭包,是Flex/AIR用于统治世界的秘密配方。 (当然,我应该提到对这个世界征服策略的一部分属性,事件以及很好的声明性或强制性数据绑定的良好支持)。

+0

感谢您的澄清。 对于我的应用来说,接收呼叫的顺序并不重要,重要的是我不会将相同的数据发送给两个呼叫者。 – 2009-01-10 02:34:29

1

将自己埋在Flex和Actionscript几个月后,已经移回到.NET;我有点被所有各种模式重新淹没 - 或者,我必须选择并协调。相比之下,Flex/AIR几乎拥有一组简单但完整的SDK调用,用于数据和文件操作,每个调用都有同步和异步变体。理解和使用一致性要容易得多。

罗杰的权利从我的经验。 Flex/AS#正常工作。 .NET,越来越小(从选项超载,恕我直言)。其中一个后果是.NET更好地适应边缘情况;但是如果Flex/AS3能够满足您的要求,它可能会轻松完成。认为80/20规则(或者更好)

我认为你的问题已经由罗杰解决,但让我说我认为我听到它的方式。

您的方法在一个通用UI线程上是单线程的(与其他UI活动一起)。但是,资源(文件,数据库管理系统端口等)通常经历,你通常会建立这样一个简单的顺序:

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

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

所以不行,你很好走。摇滚!

相关问题