zoukankan      html  css  js  c++  java
  • 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:

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

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

  • 相关阅读:
    distributed caching for .net applications
    Linux_18/ mysql
    找到一本不错的Linux电子书,附《Linux就该这么学》章节目录。
    LinuxProbe/ 疑问ABC
    Linux_15/ autofs, DNS
    Linux_14/ SAMBA, NFS
    Linux_13/ 虚拟网站主机功能,Vsftpd
    Linux_12/ Apache, SELinux
    Linux_11/ firewalld-config, SSH, bounding
    Linux_10/ iptables & firewalld
  • 原文地址:https://www.cnblogs.com/glamourousGirl/p/4646721.html
Copyright © 2011-2022 走看看