你的位置:首页 > ASP.net教程

[ASP.net教程]silverlight——多次异步调用的顺序执行


遇到这样一个功能需求,对于后台的同一个服务调用多次,但要求传入的参数能够再一个执行完之后再进行另一个参数的执行。

由于silverlight支持的是异步调用机制,故无法控制服务调用何时返回。那么如果使得参数队列的调用顺序执行呢?

想了一个晚上,搞出了一种折中办法的办法。递归实现。

 1     ObservableCollection<taskVO> ocTask = new ObservableCollection<taskVO>(); 2     taskVO currentTask; 3     int len = 0,index = 0; 4     private void btn_click(object sender , RoutedEventArgs e){ 5        6      if(ocTask == null) { 7        return; 8       } 9      len = ocTask.Count();
11 currentTask = ocTask[index]; 12 13 index++;14 client.methodAsync(currentTask);15 }16 17 void client_methodCompleted(object sender , CompletedEventArgs e){
21 22 if(index >= len) 23 {24 return;25 }26 currentTask = ocTask[index];27 index++;28 client.methodAsync(currentTask);31 }

其中ocTask是要进行多次异步调用的参数队列。

在按钮事件中,只把第一个Task进行异步调用,在回调函数中,再把下一个Task进行异步调用,依次类推,直到最后一个参数执行完了,在Completed中进行Return,结束递归(这就是课本上所学的递归函数必须有终结条件,第一次把书本上的算法应用到实际,好开森开森^_^)

PS:

解决该功能不算解决了真正的异步队列顺序调用问题。本功能具有特殊性,多次异步调用的方法是同一个,造成了使用递归正好解决了这个问题。

但递归本身的局限性,也限制了异步队列不能过长,否则导致递归栈溢出。因此这个问题还有待更加完善的解法。