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