65.9K
CodeProject 正在变化。 阅读更多。
Home

异步页面

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (1投票)

2013 年 10 月 11 日

CPOL

2分钟阅读

viewsIcon

10904

提升网站的可扩展性,以及对耗时进程的高效设计。

异步页面 

目标: 

提升网站的可扩展性,以及对耗时进程的高效设计。

注意: 这与客户端的异步请求不同。AJAX 用于改善最终用户界面,而异步页面在服务器端处理,以提供高效的请求处理方式。它尤其适用于包含查询数据库等耗时代码的网页。 

问题: 

.NET 维护一个线程池来处理传入的请求,当收到请求时,ASP.NET 会从其线程池中分配一个线程来处理该请求。

假设我们有一个涉及大量等待时间的代码,如果所有可用线程都分配给传入的请求并且正在执行耗时代码,那么额外的请求将被排队;如果达到限制,我们将收到“503 服务器不可用”错误。

可能的等待场景包括:从慢速数据库读取大量数据、从远程位置读取文件、Web 服务对象…

解决方案: 

如果我们创建异步页面,并将耗时代码在单独的线程池中执行,这将释放 ASP.NET 线程池,使其能够处理其他请求。一旦单独的线程完成其工作,ASP.NET 会分配一个可用的线程来完成操作。 这并不会以任何方式提高性能,而是一种巧妙地有效处理所有请求,从而使应用程序可扩展的方法。

示例

步骤 1

<%@ Page Async=”true” …%> 

将实现 IHttpAsyncHandler 而不是 IHttpHandler

步骤 2: 

AddOnPreRenderCompleteAsync(New BeginEventHandler  
   _(Addressof BeginTask), New EndEventHandler (Addressof EndTask)) 

当页面加载时,这将被调用。 

  • BeginEventHandler - 启动异步任务。
  • EndEventHandler - 处理来自异步任务的回调。
  • BeginTaskEndTask 是分配给上述委托的方法。

页面生命周期如下

  • Init
  • Load (加载)
  • 控件事件
  • Prerender
  • BeginTask()
  • 异步任务
  • End Task()
  • PreRenderComplete
  • Savestate
  • Render

议程

  • 初始 ASP.NET 线程
  • 另一个 ASP.NET 线程
  • ASP.NET 线程池之外的线程
© . All rights reserved.