IHttpHandler中实现异步处理和IHttpAsyncHandler中的异步处理

IHttpHandler本质上是同步运行的,即当向asp.net请求一个aspx页面,asp.net会从线程池中取出一个线程,处理此次请求。在请求未完成之前,该线程一直保持处理该请求。即使在请求的过程中,采用delegate.invoke方法,调用线程池中的线程而实现异步操作,对于这个异步调用,确实是异步的,但是处理请求的"主线程"仍然占用着资源,不能释放。

ASP.NET中,由于线程池中的线程数目是有限的,因此要使得线程尽可能得到利用,则可以通过实现IHttpAsyncHandler接口实现。IHttpAsyncHandler也是继承了IHttpHandler,但是不同的是IHttpAsyncHandler具有天生的异步能力。他比IHttpHandler多2个方法。

IHttpAsyncHandler的摘要如下:

   

 
 
  1. public interface IHttpAsyncHandler : IHttpHandler 
  2.     { 
  3.         // 摘要: 
  4.         //     启动对 HTTP 处理程序的异步调用。 
  5.         // 
  6.         // 参数: 
  7.         //   context: 
  8.         //     一个 System.Web.HttpContext 对象,该对象提供对用于向 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 
  9.         //     和 Server)的引用。 
  10.         // 
  11.         //   cb: 
  12.         //     异步方法调用完成时要调用的 System.AsyncCallback。如果 cb 为 null,则不调用委托。 
  13.         // 
  14.         //   extraData: 
  15.         //     处理该请求所需的所有额外数据。 
  16.         // 
  17.         // 返回结果: 
  18.         //     包含有关进程状态信息的 System.IAsyncResult。 
  19.         IAsyncResult BeginProce***equest(HttpContext context, AsyncCallback cb, object extraData); 
  20.         // 
  21.         // 摘要: 
  22.         //     进程结束时提供异步处理 End 方法。 
  23.         // 
  24.         // 参数: 
  25.         //   result: 
  26.         //     包含有关进程状态信息的 System.IAsyncResult。 
  27.         void EndProce***equest(IAsyncResult result); 
  28.     } 

 

BeginProce***equest 方法返回的是IAsyncResult接口,通常在BeginProce***equest中处理一些比较繁重费时的任务,比如IO操作,读取Web服务等。一旦异步操作完成之后,则可以通过EndProce***equest方法获得异步的结果。

IHttpAsyncHandler的好处在于,在它处理异步方法的时候,处理请求的线程可以暂时得到释放,而有空闲去处理其他请求,等异步方法运行完毕之后,在由线程去处理接下来的请求。因此,在处理某些特殊任务的时候,比较高效。

下面的一个小示例,演示如何使用IHttpAsyncHandler。使用起来很简单,实现BeginProce***equest,返回一个异步操作的状态,IAsyncResult。当异步操作完成后,打印出异步操作的结果。

 

 
 
  1. public class Handler2 : IHttpAsyncHandler 
  2.     { 
  3.         Func<int> f = () => 
  4.         { 
  5.             Thread.Sleep(5000); 
  6.             int sum = 0; 
  7.             for (int i = 1; i <= 100; i++) 
  8.             { 
  9.                 sum += i; 
  10.             } 
  11.             return sum; 
  12.         }; 
  13.  
  14.         public IAsyncResult BeginProce***equest(HttpContext context, AsyncCallback cb, object extraData) 
  15.         { 
  16.             context.Response.ContentType = "text/plain"
  17.             IAsyncResult areault = f.BeginInvoke(cb, context); 
  18.             return areault; 
  19.         } 
  20.  
  21.         public void EndProce***equest(IAsyncResult result) 
  22.         { 
  23.             var context = result.AsyncState as HttpContext; 
  24.             context.Response.Write(f.EndInvoke(result)); 
  25.         } 
  26.  
  27.         public bool IsReusable 
  28.         { 
  29.             get { throw new NotImplementedException(); } 
  30.         } 
  31.  
  32.         public void Proce***equest(HttpContext context) 
  33.         { 
  34.             throw new NotImplementedException(); 
  35.         } 
  36.     } 

 

个人总结,有不对的地方,请提出交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#网页版+客户端版聊天软件源码分享(C#+长连接+Sqllite数据库实现) 今天我给大家分享一个聊天程序的源码。 网页版加客户端版并存,可以互通 我相信对大家学习和扩展这一块知识是很有用的。 我们先来看下软件结构 一个Web版一个网页版,而客户端是连接的网页的 http://localhost:53947/wwwroot/Lesktop 这个路径 http://localhost:53947/wwwroot/这一部分是网页的地址,大家可以根据自己配置情况进行修改 然后浏览一下Default.aspx页面如下 这是负面版的,客户端的也是一样的,我们先来注册 一个账户 在这里我们注册两个账户还有一个是text用来聊天对话使用 注册的方法是一样的我就不多说了。 下面登录第一个账户看看 这是登录后的效果。 单击聊天室 然后我们再登录另外一个账户text 好了大家应该能看到效果了吧。 然后咱们再发个“你好” 收到了吧,再回复一个 对就是这个效果, 再来看看桌面版的 刚才的消息都在 这是桌面版的效果。 大家感觉怎么样。 我感觉大家可以在这个基础之上进行扩展,最少可以看看他的实现思路 源码分享给大家了 sufeinet.com即时通信_云骞.zip (3.25 MB, 下载次数: 1078) ReceiveResponsesHandler 类,这个主要是用来接收和维护长连接的 实现长连接的两个重要来代码预览 [C#] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Web; using System.Xml; using System.Threading; namespace Core { public class ReceiveResponsesHandler : IHttpAsyncHandler { public ReceiveResponsesHandler() { } HttpContext m_Context = null; IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) { m_Context = context; string sessionId = context.Request.Params["SessionID"]; string clientVersion = context.Request.Params["ClientVersion"]; string serverVersion = context.Request.Params["ServerVersion"]; ResponsesListener asyncResult = new ResponsesListener(sessionId, cb, extraData); try { if (serverVersion != ServerImpl.Instance.Version) throw new IncompatibleException();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值