技术开发 频道

ASP.NET中的异步页功能应用(上)

  由于 HTTP 请求需要较长时间才能返回,因此,AsyncPage.aspx.cs 异步执行对它的处理。它在 Page_Load 中注册 Begin 和 End 方法,并且在 Begin 方法中,它调用 HttpWebRequest.BeginGetResponse 启用一个异步 HTTP 请求。BeginAsyncOperation 将由 BeginGetResponse 返回的 IAsyncResult 返回到 ASP.NET,导致当 HTTP 请求完成时,ASP.NET 调用 EndAsyncOperation。EndAsyncOperation 进而分析该内容并将结果写入 Label 控件,之后进行呈现,并且 HTTP 响应返回到浏览器。
 
  当请求同步页时,ASP.NET 为该请求分配线程池中的一个线程,并在该线程上执行页。如果该请求停止执行 I/O 操作,则挂起线程,直到完成操作,从而可以完成该页的生命周期。相反,异步页通常通过 PreRender 事件执行。然后,调用使用 AddOnPreRenderCompleteAsync 注册的 Begin 方法,之后,该请求处理线程返回线程池。Begin 启动一个异步 I/O 操作,当该操作完成时,ASP.NET 从线程池提取另一个线程并调用 End 方法,并且在该线程上执行该页生命周期的其余部分。
 
异步数据绑定
 
  通常情况下,ASP.NET 页并不使用 HttpWebRequest 直接请求其他页,但它们通常查询数据库并对结果进行数据绑定。因此,您将如何使用异步页执行异步数据绑定呢?图 4 中的代码隐藏类显示进行此操作的一种方式。
using System; using System.Data; using System.Data.SqlClient; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Configuration; public partial class AsyncDataBind : System.Web.UI.Page {  private SqlConnection _connection;  private SqlCommand _command;  private SqlDataReader _reader;  protected void Page_Load(object sender, EventArgs e)  {   if (!IsPostBack)   {   // Hook PreRenderComplete event for data binding   this.PreRenderComplete += new EventHandler(Page_PreRenderComplete);    // Register async methods    AddOnPreRenderCompleteAsync(     new BeginEventHandler(BeginAsyncOperation),     new EndEventHandler(EndAsyncOperation)    );   }  }  IAsyncResult BeginAsyncOperation (object sender, EventArgs e, AsyncCallback cb, object state)  {   string connect = WebConfigurationManager.ConnectionStrings ["PubsConnectionString"].ConnectionString;   _connection = new SqlConnection(connect);   _connection.Open();   _command = new SqlCommand("SELECT title_id, title, price FROM titles", _connection);   return _command.BeginExecuteReader (cb, state);  }  void EndAsyncOperation(IAsyncResult ar)  {   _reader = _command.EndExecuteReader(ar);  }  protected void Page_PreRenderComplete(object sender, EventArgs e)  {   Output.DataSource = _reader;   Output.DataBind();  }  public override void Dispose()  {   if (_connection != null) _connection.Close();   base.Dispose();  } }
  AsyncDataBind.aspx.cs 与 AsyncPage.aspx.cs 使用相同的 AddOnPreRenderCompleteAsync 模式。但是,AsyncDataBind.aspx.cs 的 BeginAsyncOperation 方法调用 ADO.NET 2.0 中的新方法 SqlCommand.BeginExecuteReader(而非 HttpWebRequest.BeginGetResponse),以执行一个异步数据库查询。当调用完成时,EndAsyncOperation 调用 SqlCommand.EndExecuteReader 以获取 SqlDataReader,然后将其存储在私有字段中。在用于 PreRenderComplete 事件(在异步操作完成但呈现该页之前引发)的事件处理程序中,AsyncDataBind.aspx.cs 之后将 SqlDataReader 绑定到 Output GridView 控件。从外观上看,该页类似于使用 GridView 呈现数据库查询结果的普通(同步)页。但是在内部,该页更具可伸缩性,因为它并不挂起线程池线程以等待查询返回。
0
相关文章