博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现异步调用 Web Service
阅读量:6208 次
发布时间:2019-06-21

本文共 2478 字,大约阅读时间需要 8 分钟。

  hot3.png

      普通调用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) {     //Web Service代理类    ProductService.LTPService service = new ProductService.LTPService();     //调用Web方法GetClass1,将结果赋值给DoWorkEventArgs的Result对象    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的方法。

private void button2_Click(object sender, EventArgs e) {     //Web Service代理类    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); //显示从服务器获取的结果值}

代理类用vs工具生成,不会的请问度娘。

转载于:https://my.oschina.net/ind/blog/290905

你可能感兴趣的文章
常州某印刷厂服务器3个250G硬盘坏了2个的RAID5数据恢复一案
查看>>
社保医院
查看>>
织梦调用自定义字段
查看>>
java动态代理小记
查看>>
基于信息安全技术的电子病案管理
查看>>
win2008下如何快速安装PHP,并做好安全设置
查看>>
MongoDB 3.0新增特性一览
查看>>
Nokia N900 通过flasher刷机教程
查看>>
软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比
查看>>
JS 密码强度检测
查看>>
Django开发博客(基础篇)
查看>>
PDO防注入原理分析以及使用PDO的注意事项
查看>>
docker compose 部署nginx-tomcat平台
查看>>
写在前面
查看>>
js改变背景
查看>>
《MS SQL Server 2000管理员手册》系列——22. 建立及使用触发程序
查看>>
我的友情链接
查看>>
Docker源码分析(三):Docker Daemon启动
查看>>
Converting circular structure to JSON
查看>>
dhcp协议的工作流程
查看>>