ASP.NET 2.0 內建非同步頁面支援(Async="true"),完美解決長時間後端作業(如 Socket 通訊)導致的請求阻塞問題。
<%@ Page Async="true" %>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.PreRenderComplete += Page_PreRenderComplete;
}
}
protected void btnQuery_Click(object sender, EventArgs e)
{
PageAsyncTask task = new PageAsyncTask(
new BeginEventHandler(BeginSubmitAsync),
new EndEventHandler(EndSubmitAsync),
new EndEventHandler(TimeoutSubmitAsync),
null);
RegisterAsyncTask(task);
}
IAsyncResult BeginSubmitAsync(object src, EventArgs e, AsyncCallback cb, object state)
{
// 1. 發送 Socket 命令
// 2. 啟動 BeginReceive,將 IAsyncResult 回傳
return socket.BeginReceive(buffer, 0, size, flags, cb, state);
}
void EndSubmitAsync(IAsyncResult ar)
{
// 在回調執行緒中,EndReceive 迭代讀取完整資料流
// 組裝 DataSet 供後續繫結
_resultDataset = _submit.GetResultDataset(ar);
}
void TimeoutSubmitAsync(IAsyncResult ar)
{
// 超時處理:記錄日誌、回傳友善錯誤訊息
}
void Page_PreRenderComplete(object sender, EventArgs e)
{
// 非同步作業完成後,ASP.NET 再次進入生命週期至 PreRenderComplete
// 此處安全繫結 GridView
grid.DataSource = _resultDataset;
grid.DataBind();
}
此模式適用於所有長耗時 I/O 作業:Web Service 呼叫、大量資料匯出、報表生成等。