技术开发 频道

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


using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net; using System.IO; using System.Text; using System.Text.RegularExpressions; public partial class AsyncPageTask : System.Web.UI.Page {  private WebRequest _request;  protected void Page_Load(object sender, EventArgs e)  {   PageAsyncTask task = new PageAsyncTask(    new BeginEventHandler(BeginAsyncOperation),    new EndEventHandler(EndAsyncOperation),    new EndEventHandler(TimeoutAsyncOperation),   null  );  RegisterAsyncTask(task);  }  IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state)  {   _request = WebRequest.Create("http://msdn.microsoft.com");   return _request.BeginGetResponse(cb, state);  }  void EndAsyncOperation(IAsyncResult ar)  {   string text;   using (WebResponse response = _request.EndGetResponse(ar))   {    using (StreamReader reader = new StreamReader (response.GetResponseStream()))     {      text = reader.ReadToEnd();     }   }   Regex regex = new Regex("href\\s*=\\s*\"([^\"]*)\"", RegexOptions.IgnoreCase);   MatchCollection matches = regex.Matches(text);   StringBuilder builder = new StringBuilder(1024);   foreach (Match match in matches)   {    builder.Append(match.Groups[1]);    builder.Append("<br/>");   }   Output.Text = builder.ToString();  }  void TimeoutAsyncOperation(IAsyncResult ar)  {   Output.Text = "Data temporarily unavailable";  } }
  RegisterAsyncTask 的主要优势在于,它允许异步页引发多个异步调用,并延迟呈现直到所有调用完成。它也很好地适用于单个异步调用,而且它提供了 AddOnPreRenderCompleteAsync 不具有的超时选项。如果生成一个只进行一个异步调用的异步页,您可以使用 AddOnPreRenderCompleteAsync 或 RegisterAsyncTask。但对于放置两个以上异步调用的异步页,RegisterAsyncTask 极大地简化了您的操作。
 
  由于超时值是每页而非每调用设置,因此您可能想知道是否能改变单个调用的超时值。简单的回答是否。您可以通过以编程方式修改页的 AsyncTimeout 属性,逐个请求地更改超时,但是您无法将不同超时分配给从同一请求初始化的不同调用。
包装它
 
  现在,您已经了解了 ASP.NET 2.0 中异步页的实质。它们在即将推出的 ASP.NET 版本中非常易于实现,并且其体系结构允许您在一个请求中批处理多个异步 I/O 操作,并延迟该页的呈现直到所有操作完成。通过与异步 ADO.NET 和 .NET Framework 中的其他新异步功能相结合,异步 ASP.NET 页针对因充满线程池而限制可伸缩性的 I/O 绑定请求问题提供了解决方案。
 
  当生成异步页时最后需要注意的一点是,不应该启动来自 ASP.NET 使用的同一线程池的异步操作。例如,在页的异步点调用 ThreadPool.QueueUserWorkItem 会起反作用,因为该方法来自线程池,从而导致纯粹获取用于处理请求的零线程。相反,调用内置于 Framework 中的异步方法(例如,方法 HttpWebRequest.BeginGetResponse 和 SqlCommand.BeginExecuteReader)通常认为是安全的,因为这些方法倾向于使用完成端口实现异步行为。
0
相关文章