References:ASP.NET 2.0 中的非同步頁
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true Introduction:在asp.net2.0提供了非同步頁的支援。具體參考上文。這裡簡單敘述一下。1)頁面接受使用者請求,使用調用WebRequest擷取另外一個網站的資訊。2)當擷取完畢,頁面再次處理擷取結果,返回使用者。3)過程中的擷取是非同步,伺服器不始終保持和使用者的聯絡,解放了線程池。 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 AsyncPage : System.Web.UI.Page
{
private WebRequest _request;
void Page_Load (object sender, EventArgs e)
{
AddOnPreRenderCompleteAsync (
new BeginEventHandler(BeginAsyncOperation),
new EndEventHandler (EndAsyncOperation)
);
}
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 (); //Output是頁面一個Label
}
} 紅色部分是重點。大概流程:。aspx主線程接受到了使用者請求,開啟非同步模式處理BeginAsyncOperation。。在方法BeginAsyncOperation裡面,執行非同步WebRequest.Create,並且返回一個IAsyncResult給主線程。主線程停止,回收到線程池。。當WebRequest處理完畢後,通過IAsyncResult通知回主線程,主線程再次接管,調用EndAsyncOperation 處理剩下的部分。