我有一种情况,我正在启动一些对象,当它们准备好处理一些输入数据时,调用一个处理程序。
该处理程序从待处理请求的ArrayCollection中获取数据集,将其分配给对象,并从ArrayCollection中删除数据集。
(我不能从ArrayCollection弹出,因为我需要搜索它以找到一个合适的数据集 - 它并不总是最顶层的。)
两个对象是否有可能以这样的方式调用我的处理程序:(1)第一个被分配数据集;(2)第二个被分配相同的数据集,然后服务于第一个的处理程序的实例删除了它我猜(3)尝试从ArrayCollection中删除数据集时的第二个处理程序错误实例。
我对Flash Player运行时不熟悉,知道这种故障情况是否可行,或者我是否应该花些额外时间来设置某种锁定以防止它出现。
编辑:到目前为止,答案为Flex提供了热烈的评论,但我不确定他们是否回答了这个问题。要清楚,我不是要决定是否使用Flex。
如果我有一个方法:
在第一次调用#1之后但在#3之前,是否有可能另一次调用同一方法#1?
答案 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端口等)通常会通过一个简单的序列,您通常会这样设置: