领先技术 - 再探异步ASP.NET页
求看起来几乎相同。比如,如果请求的操作预期需要 30 秒完成 ,则用户将至少等待 30 秒才能获得新的页面。无论是同步还是异步实现该页面 ,都会出现这种情况。此外,如果某个异步页面耗费略微长一点时间才完成一个 请求,也很正常。那么,异步页面有何优点?
可伸缩性和性能并不完全一样。或者至少,可伸缩性与性能有关,不过是在不 同级别上,即整个应用程序而不是单个请求。异步页面的优点是,可以显著减少 ASP.NET 池中的线程的工作量。这并不会使耗时较长的请求运行更快,但它可帮 助系统按通常方式处理耗时不长的请求,也就是说,不会因运行较慢的请求而产 生任何特殊延迟。 异步请求利用异步 HTTP 处理程序,这始终是 ASP.NET 平台的一个功能。但 是,ASP.NET Web 窗体和 ASP.NET MVC 都提供了自己的功能,以便开发人员更方 便地实现异步操作。在本文其余部分,我将讨论 ASP.NET MVC 2 中的异步操作。 异步控制器操作 在 ASP.NET MVC 1.0 中,任何控制器操作都只能以同步方式运行。不过,MVC Futures 库中添加了一个新的 AsyncController 类。在一段试验期之后,控制器 的异步 API 已正式添加到 ASP.NET MVC 框架中,从 ASP.NET MVC 框架的版本 2 开始,该异步 API 已完全可用并以文档形式进行了说明。(本文讨论的是 ASP.NET MVC 2 RC 的语法和功能。)如果使用 MVC Futures 库中的 AsyncController 类,您会注意到有一些变化,API 变得更加简单清晰了。 AsyncController 的目的是确保任何公开的操作方法都以异步方式执行,而不 改变 ASP.NET MVC 框架所特有的总体编程方法。图 1 中的图显示了异步操作处 理之后的步骤顺序。 图 1 ASP.NET MVC 中异步操作方法的机制 异步点位于正在执行 的事件和已执行的事件之间。当操作调用程序通知将要执行操作时,所使用的线 程仍然是从 Web 服务器队列选择请求的原始 ASP.NET 线程。此时会执行该操作 。最后,当操作调用程序准备好通知已执行完操作的事件时,可能另一个 ASP.NET 线程会负责处理该请求。图 2 说明了这种方案。 图 2 异步操作方法调用的线程切换 在详细讨论如何创建和调试 异步方法之前,应说明异步 ASP.NET 操作的另外一个基本问题:不是所有操作都 适合以异步方式执行。 异步操作的实际目标 只有受 I/O 限制的操 作才适合成为异步控制器类上的异步操作方法。受 I/O 限制的操作是不依赖于本 机 CPU 完成的操作。当受 I/O 限制的操作处于活动状态时,CPU 只是等待外部 存储(数据库或远程服务)对数据进行处理(即下载)。受 I/O 限制的操作与受 CPU 限制的操作不同,对于后者,任务的完成取决于 CPU 的活动。 受 I/O 限制的操作的一个典型示例是调用远程服务。在这种情况下,操作方法将触 发请求,然后等待下载任何响应。实际工作将通过另外一台计算机和另一个 CPU 以远程方式完成。因此,ASP.NET 线程保持为等待和空闲状态。通过异步执行操 作或页面,将处于空闲状态的线程从等待状态释放出来,从而处理其他传入请求 ,可以使性能得到提升。 实际上,并不是所有耗时较长的操作都可通过异步操作提升性能。耗时较长的 内存中计算不会显著获益于异步实现。它的运行速度甚至可能会更慢一些,因为 同一个 CPU 将同时处理 ASP.NET 请求和计算。此外,您可能仍然需要使用 ASP.NET 线程来实际处理计算。异步实现受 CPU 限制的操作,几乎没有什么益处 。另一方面,如果使用远程资源(甚至多个资源),异步方法即使不会提高单个 请求的性能,也可大幅提高应用程序的性能。 稍后我将用示例进行说明。现在,我们重点讨论一下在 ASP.NET MVC 中定义 和执行异步操作所需的语法。 认识异步路由 异步路由与同步路由有何不同?在 MVC Futures 中,您需要使用不同的方法 来注册同 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |