异步页面





3.00/5 (1投票)
提升网站的可扩展性,以及对耗时进程的高效设计。
异步页面
目标:
提升网站的可扩展性,以及对耗时进程的高效设计。
注意: 这与客户端的异步请求不同。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
- 处理来自异步任务的回调。BeginTask
和EndTask
是分配给上述委托的方法。
页面生命周期如下
- Init
- Load (加载)
- 控件事件
- Prerender
- BeginTask()
- 异步任务
- End Task()
- PreRenderComplete
- Savestate
- Render
议程
- 初始 ASP.NET 线程
- 另一个 ASP.NET 线程
- ASP.NET 线程池之外的线程