普通调用Web Service的方法,在Web Service执行期间客户端会一直等待服务执行完毕才能响应。从而造成客户端UI线程的阻塞假死现象。这时候,异步调用就显得很有用,它可以让客户端在调用Web Service时,不至于阻塞客户端的UI线程导致假死,还可以在调用Web Service的同时做些其他的处理。异步调用Web Service也有几种不同的方法,这里介绍常用的两种。
第一种方法,是通过利用Backgroundworker对象实现。BackgroundWorker 类允许你在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果你需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
- private void button1_Click(object sender, EventArgs e)
- {
- BackgroundWorker backgroundworker = new BackgroundWorker();
-
- backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork);
-
- backgroundworker.RunWorkerCompleted +=
- new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);
-
- backgroundworker.RunWorkerAsync();
-
- ChangeProcessBar();
- }
-
- void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- if (e.Error != null)
- throw e.Error;
- progressBar1.Value = progressBar1.Maximum;
- string price = e.Result.ToString();
- MessageBox.Show("调用完成。价格是:" + price);
- }
-
- void back_DoWork(object sender, DoWorkEventArgs e)
- {
-
- ProductService.LTPService service = new ProductService.LTPService();
-
- e.Result = service.GetProductPrice("001");
- }
其中,ChangeProcessBar()方法是处理进度条控制显示的代码,用于代表其他的操作。
-
-
-
- void ChangeProcessBar()
- {
- for (int i = 0; i < 10; i++)
- {
- progressBar1.Value = i;
- System.Threading.Thread.Sleep(500);
- }
- }
第二种方法,是调用Web Service的WebMethod中的Async方法实现。当添加完Web Service的引用以后,会在本地生成代理类,其中,会有一个和原Web Service方法名字相同而后缀是Async的方法。
(示例位置:光盘\code\ch07\WindowsFormsApplication1)
- private void button2_Click(object sender, EventArgs e)
- {
-
- ProductService.LTPService service = new ProductService.LTPService();
-
- service.GetProductPriceAsync("001");
-
- service.GetProductPriceCompleted += new ProductService.
- GetProductPriceCompletedEventHandler(GetProductPriceCompleted);
-
- ChangeProcessBar();
- }
-
- void GetProductPriceCompleted(object sender, ProductService.
- GetProductPriceCompletedEventArgs e)
- {
- if (e.Error != null)
- throw e.Error;
- progressBar1.Value = progressBar1.Maximum;
- string price = e.Result.ToString();
- MessageBox.Show("调用完成。价格是:" + price);
- }
转帖地址:http://book.51cto.com/art/200906/129768.htm