2010-06-18 41 views
1

我想在无限循环中访问web服务:getMonitorData(),并在creationcomplete上返回数组,并且每次都会更新getIndex0.text。替换Flex中的无限循环

Flex不能处理无限循环,并给出超时错误1502.如果我运行for循环,直到我< 2000左右,它工作正常。

如何更换循环,以便我的webservice连续访问,结果显示在getIndex0.text中。

这是我的应用程序看起来像:

<?xml version="1.0" encoding="utf-8"?> 
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300" 
     xmlns:plcservicebean="server.services.plcservicebean.*" 
     creationComplete="clientMonitor1()"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.controls.Alert; 
      import mx.rpc.CallResponder; 
      import mx.rpc.events.FaultEvent; 
      import mx.rpc.events.ResultEvent; 


      [Bindable] public var dbl0:Number; 

//-----------Infinite Loop, Works fine if condition = i<2000------------------------ 
      public function clientMonitor1():void{ 
       for(var i:int = 0; ; i++){ 
        clientMonitor();      
       } 
      } 

      public function clientMonitor():void{ 
       var callResp:CallResponder = new CallResponder(); 
       callResp.addEventListener(ResultEvent.RESULT, monitorResult); 
       callResp.addEventListener(FaultEvent.FAULT, monitorFault); 
       callResp.token = plcServiceBean.getMonitorData(); 
      } 

      public function monitorResult(event:ResultEvent):void{ 
       var arr:ArrayCollection = event.result as ArrayCollection; 
       dbl0 = arr[0].value as Number; 
      } 

      protected function monitorFault(event:FaultEvent):void{ 
       Alert.show(event.fault.faultString, "Error while monitoring Data "); 
      } 
     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <plcservicebean:PlcServiceBean id = "plcServiceBean" 
             showBusyCursor="true" 
             fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" /> 
    </fx:Declarations> 

    <mx:Form x="52" y="97" 
      label="Double"> 
     <mx:FormItem label = "getMonitorValue"> 
      <s:TextInput id = "getIndex0" 
         text = "{dbl0}"/> 
     </mx:FormItem> 
    </mx:Form> 

</s:Group> 

回答

4

你的问题是你的循环同步运行,而实际的Web服务调用是异步的。 Flex使用基于框架的执行模型,只有一个执行线程 - 当您调用web服务时,它会立即启动连接并返回。那么永远循环,意味着你永远不会到达下一帧,结果可以被处理。循环2000次意味着你立即产生2000个连接,因为你不允许一次建立多个连接,所以它将排队等候。然后他们将在接下来的几分钟内完成。

做你想做的事情的方法可能是等到一个请求完成后再开始下一个。为此,您可以从事件处理程序的末尾调用clientMonitor(),或者专门设置一个额外的事件处理程序,以便在请求完成时调用clientMonitor()

+0

谢谢Andrew,我使用Data-> Connect to webservice生成了我的Web服务连接类。生成的类没有事件处理程序。你能给我一个例子如何生成一个。我想持续监视Web服务clientMonitor()。 – 2010-06-21 16:31:40

+0

@H P:恐怕我从来没有使用网络服务代码生成工具,对不起。 – 2010-06-21 21:34:08

1

使用Timer

启动计时器。当它触发时,停止定时器,拨打电话。当电话回来时,再次启动计时器。重复。这种类型的异步/延迟计时器循环不会使用cpu或暂停其他代码。

0

这听起来像你需要的东西像LifeCycle数据服务,这将允许您保持一个套接字打开到服务器,并允许从服务器推送通知到客户端。

连续打到远程Web服务对我来说似乎是一个非常糟糕的主意。

0

您可以通过添加一个事件侦听器来实现伪递归,该事件侦听器调用clientMonitor(),然后在clientMonitor()的末尾引发相同的事件。只需拨打clientMonitor()一次即可开始此过程。

+0

这是行不通的:事件处理程序是同步的,因此您将永远递归(或直到您遇到堆栈溢出),而不是永远循环。 – 2010-06-18 16:29:20