最近项目中遇到一个问题,有一个flex页面返回数据时间过长>30s,起初在后台方法上找原因,无效。后来跟踪了每个后台方法的执行时间,发现flex页面同一时刻调用的多个方法是串行执行的,一个方法要等到前一个方法执行完毕才开始执行,所有方法执行完毕,一起返回。这样时间就等于每个方法执行时间之和了。显然与期望的并发执行不符合。
查了下,有说是因为“IE中HTTP 1.1配置的问题。IE中对HTTP1.1 Server默认最大只有两个connection。一个connection用于其它用途,而用于Flex channel的就只有一个,在执行Remote方法时会独占connection,所以如果只有一个connection,Remote方法就只能串行执行了。”检查了自己的IE链接,最大链接是10,显然不是这个原因。
后来尝试把几个方法错时调用,首先调用执行时间最长的方法,然后延迟800毫秒,调用下一个发法,执行时间最短的方法最后调用,奇迹出现了,所有的方法开始并发执行,并且不再同时返回,而是执行完一个返回一个,页面加载数据的总时间等于执行时间最长的那个方法的时间。问题解决。
之前写法:
private function initData():void{
method1();
method2();
....
}
修改后:
private function initData():void{
method1();
setTimeout(method2,800);//延迟800毫秒后执行
....
}
[参考]:http://lujinan858.iteye.com/blog/649614
http://blog.youkuaiyun.com/yangyawen/article/details/7378194
查了下,有说是因为“IE中HTTP 1.1配置的问题。IE中对HTTP1.1 Server默认最大只有两个connection。一个connection用于其它用途,而用于Flex channel的就只有一个,在执行Remote方法时会独占connection,所以如果只有一个connection,Remote方法就只能串行执行了。”检查了自己的IE链接,最大链接是10,显然不是这个原因。
后来尝试把几个方法错时调用,首先调用执行时间最长的方法,然后延迟800毫秒,调用下一个发法,执行时间最短的方法最后调用,奇迹出现了,所有的方法开始并发执行,并且不再同时返回,而是执行完一个返回一个,页面加载数据的总时间等于执行时间最长的那个方法的时间。问题解决。
之前写法:
private function initData():void{
method1();
method2();
....
}
修改后:
private function initData():void{
method1();
setTimeout(method2,800);//延迟800毫秒后执行
....
}
[参考]:http://lujinan858.iteye.com/blog/649614
http://blog.youkuaiyun.com/yangyawen/article/details/7378194