首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 非同步頁面實作長時間 Socket 通訊

     編輯:關於ASP.NET

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 呼叫、大量資料匯出、報表生成等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved