博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IHttpHandler中实现异步处理和IHttpAsyncHandler中的异步处理
阅读量:6371 次
发布时间:2019-06-23

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

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.     } 

 

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

转载地址:http://tkuqa.baihongyu.com/

你可能感兴趣的文章
Spring Cloud 中使用Feign解决参数注解无法继承的问题
查看>>
数据迁移方案 + Elasticsearch在综合搜索列表实现
查看>>
干货 | 分分钟教你用Python创建一个区块链
查看>>
Angular开发实践(八): 使用ng-content进行组件内容投射
查看>>
canvas+websocket+vue做一个完整的你画我猜小游戏
查看>>
android复习清单
查看>>
工作代码备用
查看>>
spring cloud互联网分布式微服务云平台规划分析--spring cloud定时调度平台
查看>>
说说如何配置 Webpack
查看>>
小程序中使用箭头函数的问题
查看>>
走进 JDK 之 Long
查看>>
Android打地鼠游戏的修改和优化
查看>>
Java异常
查看>>
map、reduce、filter、for...of、for...in等总结
查看>>
html2canvas-实现页面截图
查看>>
入门 | 从文本处理到自动驾驶:机器学习最常用的50大免费数据集
查看>>
笔记-从源码角度分析alloc与init的底层
查看>>
消除GitHub上的历史记录
查看>>
自学 JAVA 的几点建议
查看>>
第十三天-企业应用架构模式-对象-关系元数据映射模式
查看>>