7.8 实现异步调用Web Service

7.8  实现异步调用Web Service

普通调用Web Service的方法,在Web Service执行期间客户端会一直等待服务执行完毕才能响应。从而造成客户端UI线程的阻塞假死现象。这时候,异步调用就显得很有用,它可以让客户端在调用Web Service时,不至于阻塞客户端的UI线程导致假死,还可以在调用Web Service的同时做些其他的处理。异步调用Web Service也有几种不同的方法,这里介绍常用的两种。

第一种方法,是通过利用Backgroundworker对象实现。BackgroundWorker 类允许你在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果你需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

(示例位置:光盘\code\ch07\WindowsFormsApplication1)

  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");   

其中,ChangeProcessBar()方法是处理进度条控制显示的代码,用于代表其他的操作。

  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.     }  

第二种方法,是调用Web Service的WebMethod中的Async方法实现。当添加完Web Service的引用以后,会在本地生成代理类,其中,会有一个和原Web Service方法名字相同而后缀是Async的方法。

(示例位置:光盘\code\ch07\WindowsFormsApplication1)

  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);   //显示从服务器获取的结果值  
posted @ 2012-02-06 14:20  ^_^肥仔John  阅读(204)  评论(0编辑  收藏  举报