异步调用webservice

  1. 云栖社区>
  2. 博客>
  3. 正文

异步调用webservice

桃子红了呐 2017-11-09 13:16:00 浏览857
展开阅读全文

今天学习webservice的异步调用。找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作。

  但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法。这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文。

  一篇引用自http://book.51cto.com/art/200906/129768.htm,是李天平的。

     文中讲了两种异步调用的方法。一种是用后台线程直接调用webservice。webservice本身没有什么不同,就是最直接的调用。异步主要是通过后台线程(BackgroundWorker,仅WinForm中调用)实现。

  文中代码引用如下:

复制代码
 1  private void button1_Click(object sender, EventArgs e)  
 2  {  
 3      BackgroundWorker backgroundworker = new BackgroundWorker();  
 4      //注册具体异步处理的方法  
 5      backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork);  
 6      //注册调用完成后的回调方法  
 7      backgroundworker.RunWorkerCompleted +=   
 8          new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);  
 9      //这里开始异步调用  
10      backgroundworker.RunWorkerAsync();  
11      //调用服务的同时客户端处理并不停止  
12      ChangeProcessBar();   
13  }  
14  //完成事件  
15  void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)  
16  {  
17      if (e.Error != null)  
18          throw e.Error;  
19      progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满  
20      string price = e.Result.ToString();   //获取处理结果  
21      MessageBox.Show("调用完成。价格是:" + price); //显示从服务器获取的结果值  
22  }  
23  //调用方法  
24  void back_DoWork(object sender, DoWorkEventArgs e)  
25  {  
26      //Web Service代理类  
27      ProductService.LTPService service = new ProductService.LTPService();  
28      //调用Web方法GetClass1,将结果赋值给DoWorkEventArgs的Result对象  
29      e.Result = service.GetProductPrice("001");   
30  } 
复制代码

 

进度条显示函数:

复制代码
 1 //<summary>  
 2 //界面的进度条显示  
 3 //</summary>  
 4 void ChangeProcessBar()  
 5 {  
 6     for (int i = 0; i < 10; i++)  
 7     {  
 8         progressBar1.Value = i;  
 9         System.Threading.Thread.Sleep(500);  
10     }  
11 
复制代码

 

 

  第二种异步调用的方法是调用webservice内置的异步调用方式。这里主要就要调用<WebService方法名>Async方法来实现异步的。

  原文代码引用如下:

复制代码
 1 private void button2_Click(object sender, EventArgs e)  
 2 {  
 3     //Web Service代理类  
 4     ProductService.LTPService service = new ProductService.LTPService();  
 5     //这里开始异步调用  
 6     service.GetProductPriceAsync("001");   
 7     //注册调用完成后的回调方法  
 8     service.GetProductPriceCompleted += new ProductService.  
 9         GetProductPriceCompletedEventHandler(GetProductPriceCompleted);  
10     //调用同时客户端处理不停止    
11     ChangeProcessBar();  
12 }  
13 //完成事件处理方法  
14 void GetProductPriceCompleted(object sender, ProductService.  
15             GetProductPriceCompletedEventArgs e)  
16 {  
17     if (e.Error != null)  
18         throw e.Error;  
19     progressBar1.Value = progressBar1.Maximum;  //调用完成了,把客户端进度条填充满  
20     string price = e.Result.ToString();         //获取处理结果  
21     MessageBox.Show("调用完成。价格是:" + price);   //显示从服务器获取的结果值  
22 
复制代码

 

 

      另外一篇博文是冯东的,其中正好对上面讲到的内容作了些补充和总结,以及在Ajax方面做了些扩展叙述。

  其中有一点,就是在Web页面的属性中添加Async="true",以使页面可以调用webservice内置的异步功能。

  Web Method代码引用如下:

复制代码
1    [WebMethod]
2    public DLL.EmployeesDataTable getEmployee()
3    {
4       DLL.EmployeesDataTable result = new DLL.EmployeesDataTable();
5       DLLTableAdapters.EmployeesTableAdapter eta = new WebServiceAsyn.DLLTableAdapters.EmployeesTableAdapter();
6       eta.FillEmployee(result);
7       return result;
8    }
复制代码

 

  客户端调用代码引用如下:

复制代码
 1 /实体化WebService引用
 2 private AsynWebService.Service1 asynSer;
 3 //构造函数初始化 WebService引用,并为异步调用WebService设置好了结果处理函数【方法名Completed】(先这么叫吧,我也不知道怎么叫)
 4 public _Default()
 5 {
 6     asynSer = new AsynWebService.Service1();
 7     asynSer.HelloWorldCompleted += new AsynWebService.HelloWorldCompletedEventHandler(asynSer_HelloWorldCompleted);
 8     asynSer.getEmployeeCompleted += new AsynWebService.getEmployeeCompletedEventHandler(asynSer_getEmployeeCompleted);
 9 }
10 protected void Button1_Click(object sender, EventArgs e)
11 {
12     //开始异步调用HelloWorld;
13     asynSer.HelloWorldAsync();
14 }
15 
16 protected void asynSer_HelloWorldCompleted(object sender, AsynWebService.HelloWorldCompletedEventArgs e)
17 {
18     this.Label1.Text = e.Result.ToString();
19 }
20 
21 protected void asynSer_getEmployeeCompleted(object sender, AsynWebService.getEmployeeCompletedEventArgs e)
22 {
23     this.GridView1.DataSource = e.Result;
24     this.GridView1.DataBind();
25 }
26 protected void Button2_Click(object sender, EventArgs e)
27 {
28     //开始异步调用getEmployee
29     asynSer.getEmployeeAsync();
30 }
复制代码

 

 

   下面是作者给出的Ajax的异步调用和作者对这两种异步调用方式的总结:

复制代码
 1 <script language="javascript" type="text/javascript">
 2     var xmlHttp;
 3     function createXMLHttpRequest()
 4     {
 5     if(window.ActiveXObject)
 6     {
 7        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 8     }
 9     else if(window.XMLHttpRequest)
10     {
11        xmlHttp = new XMLHttpRequest();
12     }        
13    }
14     
15     function requestStart()
16     {
17         if(document.getElementById("tbx1").value.length <= 4)
18         {
19             alert("用户名的长度要求大于4个字符!");
20             return false;
21         }
22         document.getElementById("sp1").innerText = "Loding";
23         var url = "default.aspx?userName=" + document.getElementById("tbx1").value;
24     createXMLHttpRequest();//创建XMLHttpRequest对象
25     xmlHttp.onreadystatechange = callBack;//为XMLHttpRequest对象指定结果处理函数
26     xmlHttp.open("GET",url);//打开链接
27     xmlHttp.send(null);//发送请求
28     }
29     //结果处理函数                
30     function callBack()
31     {
32     if(xmlHttp.readyState == 4)
33     {
34        document.getElementById("sp1").innerText = xmlHttp.responseText;
35     }
36     }        
37 </script>
复制代码

 

  作者给出的总结

  1:Ajax需要创建XMLHttpRequest对象,Asp.Net需要实体化WebService代理类对象
2:XMLHttpRequest 对象需要指定结果处理函数,Asp.Net也需要指定结果处理函数
3:XMLHttpRequest的结果处理函数必须在请求发送之前设置,Asp.Net同样也是需要在              方法被调用之前设置好结果处理函数

      作者还提到了一些Flex中的异步调用webservice的知识,用兴趣的同学可以到作者的原文中查看。

 

 

引用博文:

http://book.51cto.com/art/200906/129768.htm

http://www.cnblogs.com/interboy/archive/2007/04/06/702594.html

     

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!





















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/archive/2010/04/30/1724595.html,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
桃子红了呐
+ 关注