第二中就是注册异步任务(Register Asynchronous Task).RegisterAsyncTask比AddOnPreRenderCompleteAsync具有更大的灵活性和更多的优势。它可以允许你声明一个超时参数,同样可以声明在@Page中如:AsyncTimeout="5",以秒为单位,但要注意的是这里声明不是每个异步处理过程的超时而是整个页面的处理时间超时。同样.net framework 2.0还为注册任务引入了新的MethodAsync,MethodAsync就是为了方便处理多个异步过程的。例如:
| <%@ Page Async="true" Language="C#" %> <asp:Content ID="Content" ContentPlaceHolderID="Main" Runat="server"> <asp:Label ID="Output" Runat="server"></asp:Label> </asp:Content> public partial class AsyncPageTask : System.Web.UI.Page { private WebRequest m_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) { m_Request= WebRequest.Create("http://www.dofor.cn"); return m_Request.BeginGetResponse(cb, state); } void EndAsyncOperation(IAsyncResult ar) { string text; using (WebResponse response = m_Request.EndGetResponse(ar)) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { text = reader.ReadToEnd(); } } Regex regex = new Regex("hrefs*=s*"([^"]*)"", RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(text); StringBuilder builder = new StringBuilder(1024); foreach (Match match in matches) Output.Text = builder.ToString(); } void TimeoutAsyncOperation(IAsyncResult ar) { Output.Text = "当前数据不可用"; } } |