当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

异步调用webservice

  今天学习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 }

相关内容
赞助商链接