vs2010网站开发 SQL,godaddy wordpress托管,网站属于什么公司,网页素材网站免费概述 在本篇随笔中#xff0c;通过一些简单的示例来说一下Web Service中的异步调用模式。调用Web Service方法有两种方式#xff0c;同步调用和异步调用。同步调用是程序继续执行前等候调用的完成#xff0c;而异步调用在后台继续时#xff0c;程序也继续执行#xff0c;不…概述 在本篇随笔中通过一些简单的示例来说一下Web Service中的异步调用模式。调用Web Service方法有两种方式同步调用和异步调用。同步调用是程序继续执行前等候调用的完成而异步调用在后台继续时程序也继续执行不必等待方法处理完成而直接返回。具体的调用流程见下图 对于同步调用方法而言UI线程依赖于方法的实现方法执行时间过长将导致UI无法及时与用户进行交互。我们知道在Windows客户端中每个进程都有单一的UI进程在服务器中可扩展性依赖于线程的使用。对于异步调用方法而言能够及时于用户交互响应从而提供了良好的用户体验同时也可以改善服务器的可扩展性将服务器与通讯问题隔离。 客户端异步调用方法 在客户端异步调用是完全基于Proxy的方法异步行为最简单的模式。Visual Studio和WSDL.EXE提供对它的直接支持。所以我们不必在Web服务应用程序中编写额外的代码来处理异步调用。 遍及.NET Framework的异步调用有一个基础的设计模式Begin方法和End方法他们分别用于开始和终止异步处理。Visual Studio和WSDL.exe生成了这两种方法 BeginWebServiceMethodName——该方法通知Web服务开始处理调用并立即返回。该方法不返回Web服务调用所指定的数据类型而是返回一种实现IasyncResult接口的数据类型。 EndWebServiceMethodName——该方法通知Web服务返回先前启动的Web方法所生成的结果。 IasyncResult接口包含了WaitHandle类型的AsyncWaitHandle特性。这个公共接口允许用户的客户应用程序等待调用而且该接口将用Any或All语义例如WaitHandle.WaitOneWaitAny和WaitAll作为信号通知客户应用程序。例如如果想要客户应用程序异步等候一个Web方法可调用WaitOne来处理要完成的Web服务。 一般来说客户端异步代理方法有两种实现机制使用同步对象和回调机制也许你可能对用这个词不习惯实在找不到第二个词来代替暂且这样称呼吧 同步对象 同步对象允许用户对Web服务的方法进行调用使用Begin方法然后继续处理。在后面的程序中可以调用End方法传递同步对象以便得到调用结果。这种方式下能够继续执行函数中的程序流程而不执行回调处理。在这里调用WaitOne()方法会挂起当前线程避免忙等待的发生直到Web Services方法调用结束返回后该线程才会被重新唤起。 示例代码 /// summary
/// 利用同步对象实现异步调用
/// /summary
/// param namesender/param
/// param namee/param
private void btn_AsyncClient_Click(object sender, System.EventArgs e)
{IAsyncResult ar wsc.BeginHello(this.txt_UserName.Text, null, null);MessageBox.Show(Continue to do some other things);ar.AsyncWaitHandle.WaitOne();strHello wsc.EndHello(ar);this.rtb_Result.Text strHello;
} 回调机制 从本质上说异步回调机制是委托的.NET等价物它通过在异步操作完成时建立一个被调用的单独方法来进行工作。调用应用程序能够继续处理其他的任务直到回调函数被调用为止。这就意味着处理已经完成了应用程序可以正常运行了。使用同步对象不同于回调机制的区别是当检查Web方法是否已经完成以及检查Web方法中是否含有需要的结果时我们无法对其进行控制而在回调的情况中Web方法一旦完成这些工作就会被自动执行。 示例代码 /// summary
/// 显示结果
/// /summary
/// param namesender/param
/// param namee/param
public void UpdateResult(object sender, EventArgs e)
{this.rtb_Result.Text strHello;
}public void OnHelloComplete(IAsyncResult ar)
{strHello wsc.EndHello(ar);this.rtb_Result.Invoke(new EventHandler(UpdateResult));
}/// summary
/// 用回调机制实现异步调用
/// /summary
/// param namesender/param
/// param namee/param
private void btn_CallBack_Click(object sender, System.EventArgs e)
{AsyncCallback cb new AsyncCallback(OnHelloComplete);wsc.BeginHello(this.txt_UserName.Text, cb, null);
} 使用回调机制还是同步对象取决于用户所面临的具体情况。在检查异步调用是否完成时如果愿意对处理过程进行控制那么可以选择使用同步对象。如果觉得自己编写代码来完成对Web服务的调用且当方法一旦执行完毕就立即由所调用的特殊函数来处理所返回的结果更适合一些那么就更适合用回调机制。 在客户端使用异步方法调用可以改进UI响应度在服务器端不需要实现异步操作对服务器来说是透明的而且客户端能够在任何时间选择阻塞。 服务端使用Soap One-Way方法 在服务器端使用One-Way方法实现异步调用其实质是将单项消息发送到端点。这种方式的特点是方法没有返回值客户端方法不会从调用的服务器端方法中收到返回值我们无法判断方法结束的时间对于结果需要显式通知或者轮询。 在Web 服务端我们使用[SoapDocumentMethod]定义One-Way方法 [System.Web.Services.Protocols.SoapDocumentMethod(OneWaytrue)] 示例代码 /// summary
/// One-Way方式的异步调用Set
/// /summary
/// param namesender/param
/// param namee/param
private void btn_OneWay_Click(object sender, System.EventArgs e)
{wsc.SetHello(this.txt_UserName.Text);
}/// summary
/// One-Way方式的异步调用Get
/// /summary
/// param namesender/param
/// param namee/param
private void btn_onewayGet_Click(object sender, System.EventArgs e)
{strHello wsc.GetHello();this.rtb_Result.Text strHello;
} One-Way方法不适合于下列情况 l 方法需要对结果轮询 l 方法需要同步 服务端使用WSE SoapSender和SoapRecevier 在进行本部分内容之前我们需要安装WSE2.0。WSE支持面向消息的编程为我们提供了SoapSender和SoapReceiver基类它能够支持发送和接收SoapEnvelopes同时它也通过SoapClient和SoapService提供了更多的事务支持。SoapSender和SoapReceiver在客户端和服务端同时实现客户端使用SoapSender发送消息同时可选择使用SoapReceiver接收消息服务端使用SoapReceiver接收消息同时也可以选择使用SoapSender发送通知和回应。 示例代码 客户端 /// summary/// 自定义的消息接收类/// /summarypublic class MyReceiver: SoapReceiver{public static Form1 form;private string strBody;protected override void Receive(SoapEnvelope envelope){strBody envelope.InnerText;///注意在进行此项之前一定要把rtb_Result控件的属性设为Publicform.rtb_Result.Invoke(new EventHandler(UpdateBody));}void UpdateBody(object sender, System.EventArgs e){form.rtb_Result.Text strBody;}}
/**************************************************/
/// summary
/// 用WSE实现异步调用
/// /summary
/// param namesender/param
/// param namee/param
private void button4_Click(object sender, System.EventArgs e)
{wsc.FireEvent();
} Web Service端 private ArrayList Listeners{get{return (ArrayList)Application[Listeners];}}[WebMethod]public void AddListener(string listener){ArrayList alist (ArrayList)Application[Listeners];if(alist null)alist new ArrayList();alist.Add(listener);Application[Listeners] alist;}[WebMethod]public void FireEvent(){int i;for(i 0;i this.Listeners.Count;i){SoapEnvelope envelope new SoapEnvelope();envelope.SetBodyObject(Hello World!);envelope.Context.Addressing.Action new Action((string)(this.Listeners[i]));envelope.Context.Addressing.ReplyTo new ReplyTo(new System.Uri((string)(this.Listeners[i])));SoapSender peerProxy new SoapSender(new System.Uri((string)(this.Listeners[i])));peerProxy.Send(envelope);}} 服务端使用WSE 自定义SoapMSMQ传输 SoapMSMQ是一款开源软件简化使用WSE进行MSMQ操作下载地址 http://www.codeproject.com/useritems/SoapMSMQ.asp SoapMSMQ完全支持事务具有如下特点 l 在事务中请求要被同步初始化 l 同步阶段排队请求并且返回令牌 l 异步阶段处理各个事务 l 所有持有令牌的请求都保证会被处理但可能会不成功 l 支持向客户端发送通知 对SoapMSMQ感兴趣的朋友可以下载下来后做进一步的研究。 总结 异步方法调用改善了客户端的响应和用户体验增加了服务端的可扩展性。当方法需要耗费大量的时间时可以采用异步方式调用提供系统并发处理的能力。对于异步方式的开发我们可以有如上所述的广泛选择。 示例程序界面 下载地址http://files.cnblogs.com/Terrylee/AsyncDemo.rar 出处http://www.cnblogs.com/Terrylee/archive/2005/12/05/290845.html转载于:https://www.cnblogs.com/mq0036/p/4029497.html