ASP.NET 2.0数据源控件的异步数据访问

在第 1 部分和第 2 部分中,建立了 WeatherDataSource 控件,该控件针对 weather.com(英文)所提供的 XML API 来运行,使用 WebRequest 和 WebResponse 来通过 HTTP 访问数据。迄今为止,均是同步访问该服务。因此, 页面处理被阻止,直到 Web 请求完成为止。此方法对于测试页面是有效的,在 小站点上也可能有效,但是在接收大量通信流量的站点上则会惨败;例如门户页 面,天气模块在其中可能非常常见。

引言

在线程池中有固定不变的大量线程可用于服务请求,遗憾的是,该解决方案 并非仅仅提高限制(还会增加线程占用资源以及 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);
      }
     }
    ...
}

时间: 2024-09-04 11:39:20

ASP.NET 2.0数据源控件的异步数据访问的相关文章

ASP.NET2.0中使用数据源控件之异步数据访问

asp.net|访问|控件|数据|数据源|异步 摘要:本文是介绍数据源控件的系列文章中的第三篇.在本文中,Nikhil 着重介绍如何执行并封装异步数据访问,同时演示可重用的异步数据访问框架,该框架根据 Microsoft Visual Studio 2005 中的可用功能来建立. 在第 1 部分和第 2 部分中,建立了 WeatherDataSource 控件,该控件针对 weather.com(英文)所提供的 XML API 来运行,使用 WebRequest 和 WebResponse 来通

ASP.NET 2.0 中的异步页功能应用

asp.net|异步 下载本文源代码:WickedCode0510.exe ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用

体验ASP.NET 2.0 中的异步页功能

asp.net|异步 (一).简单介绍实现原理 下图左为未使用异步页功能执行过程(Asp.net 1.0通常情况), 下图右为使用了异步页执行过程(Asp.net 2.0新增特性). (Asp.net 1.0一般处理过程) (使用Asp.net 2.0新增特性异步页功能处理过程) 从左图中看出,在一个页面整个请求的过程中, 一个线程始终为同一个页面的请求服务. 而从右图可以看出,在一个页面请求的过程中, 可以由不同的线程为本页面请求服务. 显然,采用图中方式在客户端请求数量多时,网站整体效率较高

ASP.NET 2.0 中的异步页[来自MSDN]

ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态.这影响了可伸缩性,

ASP.NET 2.0中的异步页功能应用

ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员 和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原 因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配 给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程 用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个 远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求 的线程在调用返回之前处于挂起状态.这影响

ASP.NET 2.0中Gridview中数据操作技巧

Asp.net 2.0中新增的gridview控件,是十分强大的数据展示控件,在前面的 系列文章里,分别展示了其中很多的基本用法和技巧(详见<<ASP.NET 2.0中Gridview控件高级技巧>>.<<ASP.NET2.0利用Gridview实现 主从关系>>).在本文中,将继续探讨有关的技巧. 一.Gridview中的内容导出到Excel 在日常工作中,经常要将gridview中的内容导出到excel报表中去,在 asp.net 2.0中,同样可以很方

在Visual Studio 2005和ASP.NET 2.0中使用强类型数据存取

asp.net|visual|数据 "Never put off until run time what can be done at compile time."David Gries, Compiler Construction for Digital Computers Introduction 作为程序员,我们在学习一些新技术的时候,范例有时候会是我们最大的敌人.指南通常被设计成简单易懂,但同时里面的懒惰.无效率的甚至是危险的代码编写会增多.像这种情况最普遍存在的就是在ADO.

ASP.NET 2.0数据源控件的参数

数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数 据以及修改什么数据.通常情况下,页面包含一些 UI,以定义那些必须在选择 操作中使用的参数,而数据绑定控件提供了参数值来进行插入.更新和删除操作 .但是,在任意一种情况下,都可能同时出现两种现象.在第 1 部分中,数据源控件揭示了 ZipCode 属性,该属性可进行声明性设置,或者以编码来设置以 响应用户操作.参数被设计为以声明性(且可扩展)的方式来完成此方案. 引言 Parameter 基类代表一个通用参数.Microsoft

体验ASP.NET 2.0 中的数据访问控件

asp.net|访问|控件|数据 简介 数据访问一直是开发 Web 应用程序的一个关键问题.几乎每个商业应用程序都需要数据驱动的 Web 页面.由于数据访问如此普遍,开发人员不断地为简单的数据库任务重新生成复杂的代码就显得毫无意义了.开发人员需要从格式各异的不同数据源中快速访问数据.幸运的是,ASP.NET 2.0 中新增的数据访问控件和 ADO.NET 2.0 解决了这一问题. 对于传统的 ASP 和 ASP.NET 1.1 应用程序而言,开发人员不得不创建代码访问和更新数据库,将检索到的数据