教程:使用WebService进行异步通信

web|教程|异步

  通常在WEB应用程序中不会考虑到这个需求。做智能客户端的时候,当用到WebService时,由于服务器处理速度、网络传输速度等各种原因会使一个WebService从请求开始到获得响应结果之间等待一段时间,这时候线程会处于阻塞状态,程序会等待请求结果导致客户端无法进行其他的动作或处理。这时候就需要异步的使用WebService。

  最容易被想到的方法当然是建立一个新的线程来执行WebService的请求并获得结果,这样就可以不影响程序的主线程的工作,并且也非常容易实现,但是在一个复杂的应用程序中,用户也许会同时请求多个webservice,这时候就得创建并控制多个线程。多线程的控制虽然可以实现很好的应用程序,但难度是比较大的,而且很容易引起异常。

  在.net的SDK中实际上就有关于异步调用webservice的介绍和示例。其主要的工作原理和流程如下:

方法一、
private void button_Click_(object sender, System.EventArgs e)
{        
     //为一个Webservice的代理类创建一个实例
     asy.asynchronism someWS = new asy.asynchronism();

     //创建一个异步回调对象,构造函数的参数为回调的方法,该回调的方法必须包含一个异步操作状态类型的参数
     System.AsyncCallback cb= new AsyncCallback(showmsg);

     //开始进行异步通信,通常定义一个IAsyncResult异步操作状态类型的变量来接收开始异步通信方法所返回的通信状态
     //通过这个操作状态的实例就可以掌握当前通信状态。
     //如:System.IAsyncResult ar = someWS.BeginHelloWorld(cb,someWS);
     someWS.BeginHelloWorld(cb,someWS);

     }

void showmsg(IAsyncResult ar)   //必须要有一个IAsyncResult类型的参数
{

     //定义一个代理类的类型的变量接收所在回调方法的参数的异步操作信息
     asy.asynchronism someWS=(asy.asynchronism)ar.AsyncState;

     //该代理类实例调用End</webmethod/>方法来获得WebService的结果
     MessageBox.Show(someWS.EndHelloWorld(ar));
              
}
方法二、
private void button_Click_(object sender, System.EventArgs e)
{
     //为一个Webservice的代理类创建一个实例
     asy.asynchronism someWS = new asy.asynchronism();

     System.IAsyncResult ar = someWS.BeginHelloWorld(null,null);
              
     ar.AsyncWaitHandle.WaitOne();

     MessageBox.Show(someWS.EndHelloWorld(ar));

}

  方法一实现了请求和接收异步通信,运用起来比较灵活,工作的方法看起来也很像多线程的操作方式。

  方法二虽然也实现了发送请求和接收结果异步通信,但是用在实际的程序中并没有达到所需要的效果。

  详细的介绍请参看SDK中的描述

时间: 2024-12-29 12:58:29

教程:使用WebService进行异步通信的相关文章

WebService教程详解(一)_java

Web Services 可以将应用程序转换为网络应用程序. 通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能. Web Services 可以被其他应用程序使用. 通过 Web Services,您的会计部门的 Win 2k 服务器可以与 IT 供应商的 UNIX 服务器相连接. 基本的 Web Services 平台是 XML+HTTP. Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据. 什么是webService We

WebService教程详解(二)_java

在上篇文章给大家介绍了WebService教程详解(一) 使用工具的原因: 1. 使用工具可以更好的了解WebService请求的过程 2. 使用工具WsExplore可以获取SOAP数据发送和接收的格式 3. 使用工具Tcp/Ip Monitor可以监控拦截器请求头和响应头的具体数据 什么是SOAP? SOAP是一种基于XML编码规范的文本协议,简单的说SOAP就是在HTTP的基础上传输XML数据,以实现远程调用[无论你的服务端是什么语言书写的,只要接收SOAP协议的XML数据,并返回SOAP

JavaWeb文件上传入门教程_java

一.文件上传原理  1.文件上传的前提: a.form表单的method必须是post b.form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的数据类型) c.form中提供input的type是file类型的文件上传域  二.利用第三方组件实现文件上传  1.commons-fileupload组件: jar:commons-fileupload.jar  commons-io.jar  2.核心类或接口DiskFileItemFacto

AngularJS入门教程之服务(Service)_AngularJS

AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 有个 $location 服务,它可以返回当前页面的 URL 地址. 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &

银河系列原创教程

本文为原创,如需转载,请注明作者和出处,谢谢!     本文为银河系列原创技术文章,主要包括Struts 2入门系列教程.Struts1.x入门与提高系列教程.WebService大讲堂之Axis2系列教程.Weblogic10+EJB3入门教程.AJAX系列教程.SQL Server2005杂谈系列教程.算法系列教程.这些文章均为笔者经验总结,有的系列文章还未完成,待不断完善中... Struts 2入门系列教程  1.  第一个Struts2程序  2.  处理一个form多个submit

WebService服务和ajax使用教程

ajax|web|教程 题外话: WebService技术已经有好几年的历史了,关于基础的理论知识,此处省去,不说了.最近被炒了的ajax技术也被滥用的很是严重,至于细节,不是我说的重点. ajax技术的入门比较低,javascript和xml的一点利用,个人以为没啥含量,不能在根本上解决企业的需求或者问题,在安全性,线路传输的低级等方面都有致命的问题. 为什么要把WebService和ajax放一起,原因很简单, 两者的共同点准确的来说是经常按照同一数据协议--------XML. 本文全部源

jax-ws之webservice security(安全)教程第一天

前言: 在前面的"5天学会jaxws-webservice教程",我们讲了基本的jax-ws的使用. Jax-ws是业界公认的标准的webservice,它已经成为了一个行业界标准,包括cxf,其实cxf也是调用的jax-ws为标准的基于spring的webservice框架. 同时,大家都知道世界上除了j2ee体系外,还存在.net体系,同时有过相关经验的同事们也知道用ws-security无非就是涉及到"加密","解密",而JAVA的x509

jax-ws之webservice security(安全)教程第三天

前言: 在今天的学习中,我们讲开始过渡到一个真正的websecurity例子. 第二天中我们知道了如何使用handler来处理客户端提交上来的用户名与密码,而在今天的学习中,我们将会使用服务端预先配置的用户名与密码来authenticate客户端提交上来的值. 相对于第二天的学习,如果客户端提交的用户名与密码输错,但还是能够与服务端建立http连接来说,第三天中的例子的安全性则更高,当客户端提交上来的用户名与密码错误则更本不可能和服务端建立起有效的http连接.该例子同时适用于一切J2EE Ap

jax-ws之webservice security(安全)教程第二天

前言: 第一天里说了如何用jax-ws去结合ssh框架. 在今天的教程中将会向大家详细讲述一个ws-security中的一个传统的"基于handler"来认证客户端传来的用户名密码的webservice. 客户端传过来一对用户名和密码,服务端进行认证. 当然,我们此处说这个用户名和密码的传送,那可不是用下面的这种形式来传送的哦:  http://xxx.do?username=xxx&password=xxx. 我们这个用户名和密码是带在soap报文中的, jax-ws用一个h