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

ASP.NET 2.0 資料源控件非同步資料存取:AsyncDataSource 與 IAsyncDataSource 實作架構

     編輯:關於ASP.NET

同步資料存取會阻塞要求執行緒,導致 ThreadPool 壓力驟增。ASP.NET 2.0 透過非同步頁面機制,允許資料源控件實作非同步 Select 作業。本文剖析 DataSourceView 回呼式設計、非同步資料源控件基類架構與實作要點。

DataSourceView 非同步設計動機

public abstract class DataSourceView {
  public virtual void Select(DataSourceSelectArguments arguments,
    DataSourceViewSelectCallback callback);
  protected abstract IEnumerable ExecuteSelect(DataSourceSelectArguments arguments);
}
  • Select 不直接回傳資料,而是接受 callback 回呼——為非同步鋪路。
  • 預設實作同步呼叫 ExecuteSelect 後立即叫用 callback。
  • 非同步實作需覆寫 Select,啟動非同步工作,完成後叫用 callback。

非同步資料源控件基類架構

public abstract class AsyncDataSourceControl : DataSourceControl, IAsyncDataSource {
  private bool _performAsyncDataAccess = true;
  public virtual bool PerformAsyncDataAccess { get; set; }
  bool IAsyncDataSource.IsAsync { get { return _performAsyncDataAccess && Page.IsAsync; } }
}

public abstract class AsyncDataSourceView : DataSourceView {
  protected abstract IAsyncResult BeginExecuteSelect(DataSourceSelectArguments args,
    AsyncCallback callback, object state);
  protected abstract IEnumerable EndExecuteSelect(IAsyncResult asyncResult);

  protected override IEnumerable ExecuteSelect(DataSourceSelectArguments args) {
    // 同步封裝:呼叫 Begin/End 並阻塞等待
  }

  public override void Select(DataSourceSelectArguments args,
    DataSourceViewSelectCallback callback) {
    if (_owner.IsAsync) {
      // 註冊非同步工作:Page.RegisterAsyncTask
      // 使用 OnBeginSelect/OnEndSelect 對應 BeginExecuteSelect/EndExecuteSelect
    } else {
      base.Select(args, callback); // 同步降級
    }
  }
}

實作關鍵決策點

  1. 是否執行非同步:由資料源控件 PerformAsyncDataAccess 屬性與頁面 Page.IsAsync 共同決定。
  2. 非同步工作註冊:在 Select 中呼叫 Page.RegisterAsyncTask,傳入 BeginEventHandler/EndEventHandler。
  3. 同步降級:若頁面非非同步 (@Page Async="false"),自動退回同步 ExecuteSelect。
  4. 多控件共享資料源:非同步決策集中於資料源控件,確保多個綁定控件一致性。

適用場景

  • 呼叫外部 Web Service / REST API 取得資料
  • 長耗時資料庫查詢 (大報表、複雜 JOIN)
  • 檔案系統 / 網路資源存取
  • 高併發門戶網站的資料模組 (天氣、股票、新聞)

非同步資料源控件是 ASP.NET 2.0 釋放 ThreadPool、提升高併發效能的關鍵基礎設施,配合 @Page Async="true" 即可無縫啟用。

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