同步資料存取會阻塞要求執行緒,導致 ThreadPool 壓力驟增。ASP.NET 2.0 透過非同步頁面機制,允許資料源控件實作非同步 Select 作業。本文剖析 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); // 同步降級
}
}
}
PerformAsyncDataAccess 屬性與頁面 Page.IsAsync 共同決定。Select 中呼叫 Page.RegisterAsyncTask,傳入 BeginEventHandler/EndEventHandler。@Page Async="false"),自動退回同步 ExecuteSelect。非同步資料源控件是 ASP.NET 2.0 釋放 ThreadPool、提升高併發效能的關鍵基礎設施,配合 @Page Async="true" 即可無縫啟用。