领先技术 - 再探异步ASP.NET页
ASP.NET 始终支持同步和异步 HTTP 处理程序。现在,ASP.NET 2.0 拥有了一 些新增功能,可使开发人员更加方便快捷地创建异步页面。尤其是对于基于服务 器的应用程序,异步操作是实现可伸缩性的基础。如果需要扩展现有 Web 应用程 序,首先要考虑的是能向页面添加多少异步功能。 在这方面,ASP.NET 的行为与代表多个客户端执行某些后台工作的任何其他服 务器应用程序十分相似。每个传入请求都分配给 ASP.NET 拥有的线程,该线程是 从 ASP.NET 线程池选择的。在操作终止并为客户端生成某种响应之前,该线程将 一直被阻止。线程要等待多长时间?ASP.NET 运行时环境可配置为定义一个自定 义超时(默认值为 90 秒),但防止线程被阻止更为重要。 在处理可能耗时很长的操作时,超时最多只能确保该线程在给定秒数之后得到 释放并返回到池中。实际上,您所需要的是防止长时间阻止该线程。理想情况下 ,您需要该线程开始一个请求,然后将其交给某个其他非 ASP.NET 线程。在将响 应发送到客户端的操作完成时,将再次选择同一个线程或 ASP.NET 池中的另一个 线程。这种模式称为异步 ASP.NET 页面。 就异步操作而言,应区分相对于用户的异步页面和相对于 ASP.NET 运行时的 异步页面。对于相对于用户的异步页面,唯一的可行方法是 AJAX 操作。但是, 使用 AJAX 来执行速度可能较慢的操作会降低对最终用户的影响,但不会为 ASP.NET 运行时带来任何缓解。 异步页面和 ASP.NET 运行时 线程在请求上挂起的时间越长,为了处理新的传入请求而从 ASP.NET 池减去 一个线程的时间就越长。当没有可用于处理新请求的线程时,就会将这些请求排 队。这可能会导致延迟和总体性能下降。 在 ASP.NET 中,HTTP 处理程序在默认情况下是同步的。必须通过应用略微不 同的接口显式构建和实现异步 HTTP 处理程序。同步处理程序与异步处理程序的 主要不同之处在于,异步处理程序使用下列方法(IHttpAsyncHandler 接口的组 成部分),而不是使用同步 ProcessRequest 方法:
BeginProcessRequest 包含为处理请求而需要执行的操作。此代码应设计为在 辅助线程上启动操作并立即返回。EndProcessRequest 包含用于完成先前已启动 的请求的代码。 可以看到,一个异步 HTTP 请求分成两个部分,即“异步点”之前和之后,异 步点是请求生命周期中拥有请求的线程发生更改的点。当达到异步点时,原始 ASP.NET 线程向另一个线程交出控制权。这个可能耗时较长的操作发生在 ASP.NET 请求的两个部分之间。异步请求的每个部分都独立于另一部分运行,就 线程而言没有任何相关性。换句话说,不能保证用同一线程处理请求的两个部分 。实际效果是,在操作过程中不会阻止任何线程。 此时,明显的问题是:哪个线程实际负责处理“耗时较长”的操作?ASP.NET 在内部使用 I/O 完成端口来跟踪请求的终止。当达到异步点时,ASP.NET 将挂起 的请求绑定到一个 I/O 完成端口,并注册一个回调以在终止请求时获取通知。操 作系统将使用自己的专用线程之一来监视操作的终止,从而使 ASP.NET 线程不必 在完全空闲的状态下进行等待。操作终止时,操作系统将一条消息放置在完成队 列中,该消息将触发 ASP.NET 回调,随后,该回调获取自己的线程之一来恢复请 求。如前所述,I/O 完成端口是操作系统的一个功能。 异步页面的实际特性 在 ASP.NET 中,如果考虑改进给定页面(负责执行可能耗时较长的操作)的 性能,通常就涉及异步页面。不过,还应注意几个其他问题。从用户的角度来看 ,同步和异步请 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |