下图左为未使用异步页功能执行过程(Asp.net 1.0通常情况), 下图右为使用了异步页执行过程(Asp.net 2.0新增特性).
![]() (Asp.net 1.0一般处理过程) (使用Asp.net 2.0新增特性异步页功能处理过程) |
从左图中看出,在一个页面整个请求的过程中, 一个线程始终为同一个页面的请求服务.
而从右图可以看出,在一个页面请求的过程中, 可以由不同的线程为本页面请求服务.
显然,采用图中方式在客户端请求数量多时,网站整体效率较高. 因为:
1. 当未使用异步页时,一个线程只能为同一个页面的请求服务. 即使页面请求过程中处理其它的I/O等操作时,此线程也一直处于等待状态. 当此页面使用完此线程时,才将它放回到线程池. 线程数量是有限的! 所以当不使用线程时及时放回线池可以使系统性能大大提高!
2.当使用了异步页功能时,如右图中,开始Thread1是为页面服务的,但当页面处理其它的事情(比如I/O或调用其它WebService) 时,Thread1被放回线程池, 此时Thread1可以为其它页面请求服务了. 当此页面执行完自己的操作回来后, Thread2接着为页面请求服务,并不是使用的原来的线程Thread1. 这样网站的伸缩性会更好.
(二).使用方法示例
I. 用 Page.AddOnPreRenderCompleteAsync 实现异步页功能
a. Page标志加属性: Async="true", 添加后代码如下:
| <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AsyncPage.aspx.cs" Inherits="_Default" Async="true" %> |
b. 后台异步页面相关代码 :
| 1private WebRequest _request; 2 protected void Page_Load(object sender, EventArgs e) 3 { 4 //注册异步调用的Begin和End方法. 5 AddOnPreRenderCompleteAsync( 6 new BeginEventHandler(BeginAsyncOperation), 7 new EndEventHandler(EndAsyncOperation) 8 ); 9 } 10 11 //异步调用开始方法(当执行此方法时,当前线程就回到线程池,等待为其它请求服务). 12 IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state) 13 { 14 _request = WebRequest.Create("http://blog.csdn.net/chengking/"); 15 return _request.BeginGetResponse(cb, state); 16 } 17 18 //异步调用结束后的接收方法(异步操作执行完成后,会重新从线程池中取个线程为本页面请求服务). 19 void EndAsyncOperation(IAsyncResult ar) 20 { 21 string text; 22 using (WebResponse response = _request.EndGetResponse(ar)) 23 { 24 using (StreamReader reader = new StreamReader(response.GetResponseStream())) 25 { 26 text = reader.ReadToEnd(); 27 } 28 } 29 this.lbOupput.Text = text; 30 } |
2. 数据库对象SqlCommand实现异步调用功能.
a. Page标志加属性: Async="true", 添加后代码如下:
| <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AsyncPage.aspx.cs" Inherits="_Default" Async="true" %> |
b. 后台代码
| 1public partial class AsyncVisitDatabase : System.Web.UI.Page 2{ 3 //定义数据操作对象 4 private SqlConnection _connection; 5 private SqlCommand _command; 6 private SqlDataReader _reader; 7 8 protected void Page_Load(object sender, EventArgs e) 9 { 10 if (!IsPostBack) 11 { 12 //注册事件Page_PreRender执行完成时执行方法 13 this.PreRenderComplete += new EventHandler(Page_PreRenderComplete); 14 15 /**////注册异步调用的Begin和End方法. 16 AddOnPreRenderCompleteAsync( 17 new BeginEventHandler(BeginAsyncOperation), 18 new EndEventHandler(EndAsyncOperation) 19 ); 20 } 21 } 22 23 //异步调用开始方法(当执行此方法时,当前线程就回到线程池,等待为其它请求服务). 24 IAsyncResult BeginAsyncOperation(object sender, EventArgs e, Asyn
最新文章
推荐文章
热点文章
|


