本文共 2015 字,大约阅读时间需要 6 分钟。
IHttpHandler本质上是同步运行的,即当向asp.net请求一个aspx页面,asp.net会从线程池中取出一个线程,处理此次请求。在请求未完成之前,该线程一直保持处理该请求。即使在请求的过程中,采用delegate.invoke方法,调用线程池中的线程而实现异步操作,对于这个异步调用,确实是异步的,但是处理请求的"主线程"仍然占用着资源,不能释放。
ASP.NET中,由于线程池中的线程数目是有限的,因此要使得线程尽可能得到利用,则可以通过实现IHttpAsyncHandler接口实现。IHttpAsyncHandler也是继承了IHttpHandler,但是不同的是IHttpAsyncHandler具有天生的异步能力。他比IHttpHandler多2个方法。
IHttpAsyncHandler的摘要如下:
- public interface IHttpAsyncHandler : IHttpHandler
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- IAsyncResult BeginProce***equest(HttpContext context, AsyncCallback cb, object extraData);
-
-
-
-
-
-
-
- void EndProce***equest(IAsyncResult result);
- }
BeginProce***equest 方法返回的是IAsyncResult接口,通常在BeginProce***equest中处理一些比较繁重费时的任务,比如IO操作,读取Web服务等。一旦异步操作完成之后,则可以通过EndProce***equest方法获得异步的结果。
IHttpAsyncHandler的好处在于,在它处理异步方法的时候,处理请求的线程可以暂时得到释放,而有空闲去处理其他请求,等异步方法运行完毕之后,在由线程去处理接下来的请求。因此,在处理某些特殊任务的时候,比较高效。
下面的一个小示例,演示如何使用IHttpAsyncHandler。使用起来很简单,实现BeginProce***equest,返回一个异步操作的状态,IAsyncResult。当异步操作完成后,打印出异步操作的结果。
- public class Handler2 : IHttpAsyncHandler
- {
- Func<int> f = () =>
- {
- Thread.Sleep(5000);
- int sum = 0;
- for (int i = 1; i <= 100; i++)
- {
- sum += i;
- }
- return sum;
- };
-
- public IAsyncResult BeginProce***equest(HttpContext context, AsyncCallback cb, object extraData)
- {
- context.Response.ContentType = "text/plain";
- IAsyncResult areault = f.BeginInvoke(cb, context);
- return areault;
- }
-
- public void EndProce***equest(IAsyncResult result)
- {
- var context = result.AsyncState as HttpContext;
- context.Response.Write(f.EndInvoke(result));
- }
-
- public bool IsReusable
- {
- get { throw new NotImplementedException(); }
- }
-
- public void Proce***equest(HttpContext context)
- {
- throw new NotImplementedException();
- }
- }
- }
个人总结,有不对的地方,请提出交流。
转载地址:http://tkuqa.baihongyu.com/