ASP.NET的异步实现方式总结(一)

 

对于异步的实现,首先进入我们大脑的就是AJAX,AJAX是一种客户端的技术,对于服务端技术的异步微软绝不逊色。。。那么让我们一起来看一下吧。。。

 

在.NET中,异步都是建立在IAsyncResult接口之上的,而BeginXxxxx/EndXxxxx是对这个接口最直接的使用方式,所以我们来看如下的列子

 

一、异步 HttpHandler

关于HttpHandler的接口是个同步调用接口,它并没有异步功能。要想支持异步,则必须使用另一个接口:IHttpAsyncHandler

 
 
  1. //定义 HTTP 异步处理程序对象必须实现的协定。  
  2. public interface IHttpAsyncHandler : IHttpHandler  
  3. {  
  4.     //启动对 HTTP 处理程序的异步调用。  
  5.     //context: 一个 System.Web.HttpContext 对象,该对象提供对用于向 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session  
  6.     //      和 Server)的引用。  
  7.     //extraData: 处理该请求所需的所有额外数据。  
  8.     //cb: 异步方法调用完成时要调用的 System.AsyncCallback。如果 cb 为 null,则不调用委托。  
  9.     //返回结果:包含有关进程状态信息的 System.IAsyncResult。  
  10.     IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);  
  11.     // 进程结束时提供异步处理 End 方法。  
  12.     // result: 包含有关进程状态信息的 System.IAsyncResult。  
  13.     void EndProcessRequest(IAsyncResult result);  

这个接口也很简单,只有二个方法,启动对 HTTP 处理程序的异步调用和 进程结束时提供异步处理 End 方法。

下面我们来看一下如何创建一个支持异步的ashx文件

public class AsyncHandler : IHttpAsyncHandler {  

 
 
  1.  
  2.     private static readonly string ServiceUrl = "http://localhost:22132/service/DemoService/CheckUserLogin";  
  3.       
  4.     public void ProcessRequest(HttpContext context)  
  5.     {  
  6.         // 注意:这个方法没有必要实现。因为根本就不调用它。  
  7.         // 但要保留它,因为这个方法也是接口的一部分。  
  8.         throw new NotImplementedException();  
  9.     }  
  10.       
  11.     public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)  
  12.     {  
  13.         // 参数cb是一个ASP.NET的内部委托,EndProcessRequest方法将在那个委托内部被调用。  
  14.           
  15.         LoginInfo info = new LoginInfo();  
  16.         info.Username = context.Request.Form["Username"];  
  17.         info.Password = context.Request.Form["Password"];  
  18.  
  19.         MyHttpClient<LoginInfo, string> http = new MyHttpClient<LoginInfo, string>();  
  20.         http.UserData = context;  
  21.  
  22.         // 注意:您所需要的回调委托,ASP.NET已经为您准备好了,直接用cb就好了。  
  23.         return http.BeginSendHttpRequest(ServiceUrl, info, cb, http);  
  24.  
  25.     }  
  26.  
  27.     public void EndProcessRequest(IAsyncResult ar)  
  28.     {  
  29.         MyHttpClient<LoginInfo, string> http = (MyHttpClient<LoginInfo, string>)ar.AsyncState;  
  30.         HttpContext context = (HttpContext)http.UserData;  
  31.           
  32.         context.Response.ContentType = "text/plain";  
  33.         context.Response.Write("AsyncHandler Result: ");  
  34.  
  35.         try {  
  36.             // 结束异步调用,并取得结果  
  37.             string resultdemo = http.EndSendHttpRequest(ar);  
  38.             
  39.             context.Response.Write(resultdemo);  
  40.         }  
  41.         catch( System.NET.WebException wexb ) {  
  42.             context.Response.StatusCode = 500;  
  43.             context.Response.Write(HttpWebRequestHelper.SimpleReadWebExceptionText(wexb));  
  44.         }  
  45.         catch( Exception exb ) {  
  46.             context.Response.StatusCode = 500;  
  47.             context.Response.Write(exb.Message);  
  48.         }  
  49.     } 

总结如下:

1. 在BeginProcessRequest()方法,调用要你要调用的异步开始方法,通常会是另一个BeginXxxxx方法。

2. 在EndProcessRequest()方法,调用要你要调用的异步结束方法,通常会是另一个EndXxxxx方法。 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值