ITPub博客

首页 > Linux操作系统 > Linux操作系统 > WCF、sliverlight异步返回分析

WCF、sliverlight异步返回分析

原创 Linux操作系统 作者:张国平 时间:2010-03-11 15:18:50 0 删除 编辑

 

我现在开发的东西,使用WCF和sliverlght配合,其中WCF提供服务,sliverlight做前段显示,碰到很多sliverlight应用返回的问题。其中一个是循环,一个是等待阻塞

OK,

按照这个为例子:

http://www.aspxcs.net/HTML/104052632.html

通常调用返回值的方法是调用e.Result,调用方法是

 {    client.GetRandomAsync(100); 
     client.GetRandomCompleted += new EventHandler(client_GetRandomCompleted); 
} 
 
void client_GetRandomCompleted(object sender, WCFTest.DataServiceRef.GetRandomCompletedEventArgs e)  
 {  
     this.txtData.Text = "The return data is "+e.Result.ToString(); 
}

其中GetRandomAsync(100);可以视为给wcf发送信息,启动GetRandom事件。

而  client.GetRandomCompleted += new EventHandler(client_GetRandomCompleted);是说明当GetRandom完成后,触发client_GetRandomCompleted事件。

而,WCFTest.DataServiceRef.GetRandomCompletedEventArgs包含返回值,就是e.Result。这样在触发中处理返回值。

不过这样要写新的方法,而且很多方法内的变量要变成全局变量才可以传值,尤其是在用多个返回值的时候,大大增加麻烦。一种更灵活的返回值处理方法是

{

 client.getRandomAsync(i);

                client.getRandomCompleted += (sender2, e2) =>
                {
                
                        this.rumun.Text = e2.Result + "";
                        da += e2.Result;
                   
                                       
                };

}

这个是一个简单的方法,其中sender2, e2,分别是触发和返回,可以直接在后面进行处理,简单很多。

OK,我常常会有一个问题,就是等待返回值阻塞的问题,比如我要从WCF里面获得返回值,再进行下一步操作。

比较麻烦的方法是,把下一步操作放在完成触发的方法里面,比如

 {    client.GetRandomAsync(100); 
     client.GetRandomCompleted += new EventHandler(client_GetRandomCompleted); 
} 
 
void client_GetRandomCompleted(object sender, WCFTest.DataServiceRef.GetRandomCompletedEventArgs e)  
 {  

//这个txt显示事件就放在触发方法里面
     this.txtData.Text = "The return data is "+e.Result.ToString(); 


}

如果要等待的时间太多了,或者逻辑情况很麻烦的话,就头大了。比如这个情况

      {          client.getRandomAsync(6);
       
                client.getRandomCompleted += new EventHandler(client_getRandomCompleted);
    
          
            MessageBox.Show(da.ToString());
        }
      
        void client_getRandomCompleted(object sender, getRandomCompletedEventArgs e)
        {
            da += e.Result;
            MessageBox.Show(da.ToString());
                    }

就会出现两个不同的结果,一个是0,一个是后来的WCF的返回值。

解决这个问题,一个是改变程序设计,还有就是用AsyncCallback parameter and wrappers for Begin / End.

这个后面再说

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22259926/viewspace-629273/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
SAP 金融风险管理产品专家

注册时间:2009-08-05

  • 博文量
    229
  • 访问量
    635993