- 热门文章:
- · ASP.NET2.0中数据源控件之异步数据访问(2)
- · 中国地区三级联动下拉菜单代码和示例(1)
- · 中国地区三级联动下拉菜单代码和示例(2)
- · 一种“您无权查看该网页”的原因和解决方法
- · ASP.NET 揭秘 ASP.NET页面的结构
- · 使用@Page指令的Src属性 简化对老版本的asp.net程序的维护
- · 一个通用的保护ASP系统的方法
- · ASP.NET 2.0中DataTable小兵变大将
- · asp.net开发web项目-vss集成环境配置
- · ASP.NET中为DataGrid添加合计字段
- · 部署ASP.NET(包含.net framework 和MDAC)
- · 当DataSet中包含主/子表时,Update更新步骤
上一篇:ASP.NET编程入门随想之宽容(2) >>
ASP.NET2.0中数据源控件之异步数据访问(1)
引言
在线程池中有固定不变的大量线程可用于服务请求,遗憾的是,该解决方案并非仅仅提高限制(还会增加线程占用资源以及 CPU 占用资源)。因此,当一个页面被阻止而等候另一个服务器时,它还在占用线程,因而可能会导致其他传入的请求在队列中等候更长的时间。这将导致对站点的访问变慢,并降低 CPU 的利用率。在 Visual Studio 2005 中,我们引入了异步页面,这使得控件能够定义它们希望异步完成的任务,即,无需阻止用来处理请求的线程。在此将不介绍异步页面本身的详细信息,Dmitry(英文)和 Fritz Onion(英文)中以前已经有所介绍。此处要介绍的是如何在数据源控件中利用此功能,使用加载项框架来实现异步数据源。
背景
在第 1 部分中,间接提到了 DataSourceView 类的有些古怪的设计:
public abstract class DataSourceView {
public virtual void Select(DataSourceSelectArguments arguments,
DataSourceViewSelectCallback callback);
protected abstract IEnumerable ExecuteSelect(
DataSourceSelectArguments arguments);
...
}
您会注意到,公共 Select 方法实际上并不返回任何数据。而是接受一个回拨,并通过该回拨来返回数据。它只调用受保护的 ExecuteSelect(它始终执行同步数据访问)来检索要退还给数据绑定控件的数据。DataSourceView 类的默认实现实际上不会异步执行任何操作。原因在于,并不存在任何现成的异步数据源控件。但 OM 的设计确实允许实现异步数据访问,在这种设计下,数据在异步工作完成之后才可用。因此,我们就有了一个基于回拨的模型。
那些熟悉框架中的异步 API 的人会注意到缺少了异步模式:公共 Select、BeginSelect 和 EndSelect 方法,在这些方法中,数据绑定控件选择要调用哪些方法。但是,数据绑定控件并不能确定是选择同步 API 还是选择异步 API。此外,在数据绑定控件上添加属性也毫无作用。数据源控件封装了有关如何访问数据存储的详细信息,对数据存储的访问是同步发生还是异步发生应该根据数据源是否基于语义来决定或者根据自定义属性来决定。潜在的“bool PerformAsyncDataAccess”属性的正确位置适合于数据源控件本身。这还使得数据源控件可以使用一种方法来执行数据访问,即使多个数据绑定控件被绑定到同一个数据源。至此已多次解释了该体系结构所蕴涵的这些微妙的概念,但愿能阐明该设计。
关于异步任务,最后要注意的一点是:页面是否应该执行任何异步工作完全由页面开发人员最终决定(通过 Page 指令的 Async 属性)。因此,任何编写良好的数据源控件必须退化为根据需要来执行同步数据访问。
框架
在此框架中(在此系列结尾会用示例的剩余部分来演示这一点),已将 AsyncDataSource 和 AsyncDataSourceView 基类放在一起,这些基类可以用于实现能够执行异步数据访问的数据源控件。以下大概介绍了框架内容,以及有助于弄清楚其含义的一些注释:
public abstract class AsyncDataSourceControl : DataSourceControl,
IAsyncDataSource {
private bool _performAsyncDataAccess;
protected AsyncDataSourceControl() {
_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 arguments,
AsyncCallback asyncCallback,
object asyncState);
protected abstract IEnumerable EndExecuteSelect(
IAsyncResult asyncResult);
protected override IEnumerable ExecuteSelect(
DataSourceSelectArguments arguments) {
//实现从 DataSourceView 中继承的
//抽象 ExecuteSelect 方法,
//方法是使用 BeginExecuteSelect 和 EndExecuteSelect,
//以便通过阻止来
//进行同步数据访问。
}
private IAsyncResult OnBeginSelect(object sender,
EventArgs e, AsyncCallback asyncCallback,
object extraData);
private void OnEndSelect(IAsyncResult asyncResult);
public override void Select(DataSourceSelectArguments arguments,
DataSourceViewSelectCallback callback) {
if (_owner.IsAsync) {
//使用 OnBeginSelect 和 OnEndSelect
//作为 BeginEventHandler 和 EndEventHandler 方法,
//来调用 Page.ReGISterAsyncTask,
//以指明需要
//进行异步工作。这些方法将依次
//调用特定的
//数据源实现,方法是调用
//已在此类中引入的
//抽象 BeginExecuteSelect 和 EndExecuteSelect
//方法。
}
else {
//执行同步数据访问
base.Select(arguments, callback);
}
}
...
}
下一篇:ASP.NET2.0中数据源控件之异步数据访问(2) >>
相关文章:
- · ASP的含义、功能和选择
- · ASP中巧用Response属性 -- contenttype
- · ASP进阶学习必经之认识数学函数11种
- · 初学ASP:入门经验谈
- · ASP两种调试程序的方法
- · 学以致用 驳“ASP低能论”
- · 动态网页初学:ASP个人上手指南
- · ASP内置对象Request和Response详解
- · 一些左右你网页水平的教程
- · ASP站长助手源代码
- · ASP错误大全
- · 关于学习ASP和编程的28个观点
- · 人文的ASP开发基础入门之简介
- · ASP小偷(远程数据获取)程序的入门教程
- · VBScript语法速查及实例说明
- · 带多选项的域名查询
- · Open FSO
- · ASP学习前准备
- · ASP教程:Are you ready?
- · Application对象
- · ASP教程之ASP基础简介
- · Cookie集合
- · ASP的开发工具
- · 数据库连接(无错)
- · session在验证管理登陆时的使用方法
- · Request和Response对象
- · asp当中判断函数一览
- · ASP脚本循环语句
- · C/S、B/S软件技术上的比较
- · ASP VBScript 函数速查表
- · 初学asp的朋友 asp20条
- · Cookie和会话状态
- · 用ASP实现远程批量文件改名
- · 初学.net遇到的问题:数据库访问连接问题
- · ASP在服务器自动解压RAR文件
- · ASP生成静态htm页面基本代码!
- · 在ASP文件中调用DLL
- · 如何使用ASP建立虚拟的FTP服务器(上)
