为简化分析,我们用下面的图来示意异步处理程序的并发处理过程。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/5/B515529720.png" />
这样,我们就可以通过异步的方式,将WEB线程撤底释放出来。由WEB线程进行请求的接收与结束处理,耗时的操作与等待都进行异步处理。这样少量的WEB线程就可以承受大量的并发请求,WEB线程将不再成为系统的瓶颈。
在大并发的异步模式下,和前面的数据相比较,可以看到HttpApplication的对象数量随并发处理数提高而提高,随之带来的一系列数据结构,如 HttpHandler缓存,是需要考虑的内存开销。同时,在异步模式下,请求的完成需要编程的方式来控制,在触发完成前,客户端连接、 HttpContext对象都保持活动状态,客户端也一直保持等待,直到超时。因此,异步模式下需要更细致的资源操作。
我们来看ASP.NET异步 的典型应用场景。
场景一:处理过程中有需要等待的任务,并且可以使用异步完成的。
- //同步方法
- public void ProcessRequest(HttpContext context)
- {
- FileStream fs = new FileStream("", FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.Asynchronous);
- fs.CopyTo(context.Response.OutputStream);
- }
- //异步方法开始
- public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
- {
- FileStream fs = new FileStream("D:\\a.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.Asynchronous);
- var task = fs.CopyToAsync(context.Response.OutputStream);
- task.GetAwaiter().OnCompleted(() => cb(task));
- return task;
- }
- //异步方法结束
- public void EndProcessRequest(IAsyncResult result)
- {
- }
这个处理程序读取服务器的文件并输出到客户端。
- //同步方法
- public void ProcessRequest(HttpContext context)
- {
- var url = context.Request.QueryString["url"];
- var request = (HttpWebRequest)WebRequest.Create(url);
- var response = request.GetResponse();
- var stream = response.GetResponseStream();
- stream.CopyTo(context.Response.OutputStream);
- }
- //异步方法开始
- public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
- {
- //构建异步结果并返回
- var result = new WebAsyncResult(cb, context);
- var url = context.Request.QueryString["url"];
- var request = (HttpWebRequest)WebRequest.Create(url);
- var responseTask = request.GetResponseAsync();
- responseTask.GetAwaiter().OnCompleted(() =>
- {
- var stream = responseTask.Result.GetResponseStream();
- stream.CopyToAsync(context.Response.OutputStream).GetAwaiter().OnCompleted(() =>
- {
- result.SetComplete();
- });
- });
- return result;
- }
- //异步方法结束
- public void EndProcessRequest(IAsyncResult result)
- {
- }
这