异步操作 (ADO.NET)

某些数据库操作(例如命令执行)可能要花费很长时间才能完成。 在此类情况下,单线程应用程序必须阻塞其他操作,并且等待该命令完成,然后才可以继续执行它们自己的操作。 比较而言,如果能够将长时间运行的操作分配给某个后台线程,就可以允许前台线程在整个操作期间保持活动状态。 例如,在 Windows 应用程序中,通过将长时间运行的操作委托给后台线程,可允许用户界面线程在操作执行时保持响应状态。

.NET Framework 提供若干标准异步设计模式,开发人员可以通过这些模式充分利用后台线程并释放用户界面线程或高优先级的线程以完成其他操作。 ADO.NET 在其 SqlCommand 类中支持相同的设计模式。 具体而言,BeginExecuteNonQuery、BeginExecuteReader 和 BeginExecuteXmlReader 方法(与 EndExecuteNonQuery、EndExecuteReader 和 EndExecuteXmlReader 方法搭配)提供异步支持。

只在 Microsoft Windows XP 和 Windows 2000 中支持这些方法,在 Windows 98 或 Windows ME 中不支持这些方法。

说明:

异步编程是 .NET Framework 的核心功能,并且 ADO.NET 充分利用了标准设计模式。 有关可供开发人员使用的不同异步技术的更多信息,请参见使用异步方式调用同步方法。

尽管将异步技术与 ADO.NET 功能一起使用没有什么新增的需特别注意的事项,但与 .NET Framework 的其他领域相比,很可能更多的开发人员将在 ADO.NET 中使用异步功能。 了解创建多线程应用程序的优缺点十分重要。 本节之后的那些示例指出了若干重要问题,开发人员在开发纳入了多线程功能的应用程序时将需要考虑这些问题。

本节内容

使用回调的 Windows 应用程序 (ADO.NET)

提供一个示例,演示如何安全地执行异步命令,并且通过单独线程正确处理与某一窗体及其内容的交互。

使用等待句柄的 ASP.NET 应用程序 (ADO.NET)

提供一个示例,演示如何从 ASP.NET 页执行多个并行命令,并且使用等待处理管理在所有命令都完成时的操作。

在控制台应用程序中轮询 (ADO.NET)

提供一个示例,演示如何在控制台应用程序中使用轮询来等待异步命令执行的完成。 在类库或没有用户界面的其他应用程序中此技术同样有效。

上述说明来自Mircrosoft TeachNet http://technet.microsoft.com/zh-cn/zw97wx20.aspx。在以往开发过程中,还未考虑到对数据库的优化,以至于埋没了ADO.NET Asynchronously功能。在使用过程中我总结:同步和异步连接数据库各有利弊,同步在连接数据库时,数据在下载过程中IE甚至机器较慢。在数据库的下载过程中,IE是等数据完全下载完以后才呈现给用户,用户才可以操作控制,这时IE所呈现给我们的只是一个全白界面,让人等起来心急;相反,异步连接数据库下载数据同时,可以对机器进行操作。这里所指的操作最好只限查询操作,因为连接句柄正在使用,进行Insert、Update等操作时可能会引发异常。所以在使用时一定要适当。下面将附上异步显示数据库与普通连接数据库的代码,同时利用HttpWatch进行查看。

private static string connectionString = @"Data Source=CHINESE-3F6F8FF"SQLEXPRESS;
               Initial Catalog=Northwind;User ID=sa;Pwd=000000;Asynchronous Processing=true;";
    private const string sqlSelectString = "Select * from products ";
    private DateTime startTime, endTime;
    protected void Page_Load(object sender, EventArgs e)
    {
        //非异步连接数据库
         startTime = DateTime.Now;
         SqlConnection conn = new SqlConnection(connectionString);
         SqlCommand cmd = conn.CreateCommand();
         cmd.CommandType = CommandType.Text;
         cmd.CommandText = sqlSelectString;
         conn.Open();
         long startTicks = DateTime.Now.Ticks;
         SqlDataReader result = cmd.ExecuteReader();

GridView1.DataSource = result;
         GridView1.DataBind();

long endTicks = DateTime.Now.Ticks;
         Label1.Text = ("Time taken : " + (endTicks - startTicks) + " ticks.");
         ;
         conn.Close();
        //异步操连接数据库并查询
        //if (!IsPostBack)
        //{
        //    BindData();
        //    Label2.Text = (endTime - startTime).ToString();
        //}
      }
    private void Page_Unload(object sender, System.EventArgs e)
    {
        endTime = DateTime.Now;
    }
    private void BindData()
    {

using (SqlConnection conn = new SqlConnection(connectionString))
        {
            SqlCommand cmd = new SqlCommand(sqlSelectString, conn);
            IAsyncResult ASynResult;
            SqlDataReader dr;
            try
            {
                conn.Open();
                //begin方法返回一个IAsyncResult对象,用来检查执行是否完成
                ASynResult = cmd.BeginExecuteReader(CommandBehavior.CloseConnection);
                while (!ASynResult.IsCompleted)
                {
                    ASynResult.AsyncWaitHandle.WaitOne(3000, true);
                }
                dr = cmd.EndExecuteReader(ASynResult);
                GridView1.DataSource = dr;
                GridView1.DataBind();
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
        }

}

在页面上我利用页面的加载与卸载来计算页面用时,但有很多不确定的因素,无法计算出两种情况哪个更节省时间,见下图:

非异步连接数据库图:
异步连接数据库图
这两个数据可能因不同机器,有很多不确定性,我也不知这种方式得出的结论是否可信。但从我做的实验以及我在用的过程中可以发现,从时间角度二者并没有太大的差异,我觉得只是异步方式提前把页面呈现给用户,使用户感觉上快了。以上这些不知说的是否正确,有不对的地方请指正。谢谢!

转载于:https://www.cnblogs.com/mzoylee/archive/2009/04/26/1444057.html

ADO.NET2.0 Querying Large Result Sets Asynchronously(ADO.NET 异步操作)相关推荐

  1. 深入解读ADO.NET2.0的十大最新特性

    篇文章概述了.NET Framework 2.0里的ADO.NET2.0的最新特性.在以下叙述中将附带一些简单的例子来讨论这些特性的细节.以下便是ADO.NET新增的特性: 1. 批量复制操作(Bul ...

  2. 数据访问函数库 for ado.net2.0

    前言 源代码和调用演示下载:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html  数据访问函数库for ado.net 1.1 的说明 ...

  3. ADO.NET2.0的十大新特性

    这篇文章概述了.NET Framework 2.0里的ADO.NET2.0的最新特性.在以下叙述中将附带一些简单的例子来讨论这些特性的细节. 以下便是ADO.NET新增的特性: 1. 批量复制操作(B ...

  4. ASP.NET2.0通用数据访问类

    .NET框架自带的数据提供器包括SQLServer(System.Data.SqlClient).Oracle    (System.Data.Oracleclient).OLEDB(System.D ...

  5. 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。...

    分页控件的源代码下载网址:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html (在网页的下面) 下载文件里面由一个测试网页:http: ...

  6. asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.5.1 ...

  7. 深度解析ASP.NET2.0中的Callback机制

    callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了.但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么,就要先深入了解callback的实现机制 ...

  8. asp.net2.0学习历程 菜鸟到中级程序员的飞跃

    如果你是一个菜鸟或者自认为初学者那么本文非常适合你: 不能说这30本书就是最佳组合,但是可以说这个组合不差: 本人曾博览群书,很多书重复,很多书讲的不适用,这些书都是目前书店可以买到的: 达到中级程序 ...

  9. ASP.NET2.0 ObjectDataSource的使用详解(1)

    本系列文章将介绍ObjectDataSource的使用,为了内容的完成性,所以虽然简单,但是还是发到首页,不知道行不行 本系列文章主要参考MSDN,ASP.NET快速入门和ASP.NET的文章整理而成 ...

最新文章

  1. Houdini魔法特效制作学习教程
  2. Python中的数据结构
  3. python画饼状图的包_Python数据可视化:画饼状图、折线图、圈图
  4. C/C++ VS中调用matlab函数的方法
  5. 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程
  6. 和哪个专业的男生谈恋爱最惨?
  7. python2还能用吗_官方推荐python3,为何还有人在用python2呢?
  8. 02 | 纵览全局:把握 Netty 整体架构脉络
  9. 第八届蓝桥杯第四题方格分割
  10. C++教程:C++工程构建常用工具有哪些?
  11. JavaScript实现监听移动端上下左右滑动事件
  12. 一维 cnn matlab,1D-CNN 一维信号的深度学习算法和例子包括CNN - 下载 - 搜珍网
  13. win10录屏_不需要第三方软件,看看WIN10自带的几个强大的截图、录屏工具
  14. WinCC 扇形旋转制作
  15. 记录下这一年发生的事
  16. 经典4电阻差动放大器
  17. AlertManager实现企业微信报警(十三)
  18. python-networkx库的使用1
  19. k-中心点算法(k-medoids)及Matlab代码实现
  20. RK3399外设驱动之RTC驱动(二):hym8563驱动

热门文章

  1. 【NOIP1999】【Luogu1015】回文数(高精度,模拟)
  2. 【Luogu1111】修复公路(MST模板)
  3. spark需要maven管理吗_使用Eclipse编写Spark应用程序(Scala+Maven)
  4. 大学计算机应用技术基础实践教程答案,【最新资料】大学计算机基础实践教程习题答案.doc...
  5. 第一章节 c#面向对象
  6. android标签循环,iOS和Android规范解析——标签导航和分段控件
  7. linux arm 虚拟机,ARM平台上实现Linux内核虚拟机技术研究
  8. fanuc机器人编程手册_FANUC机器人示教编程:距离先执行指令功能介绍与使用方法
  9. [leetcode]1306. 跳跃游戏 III
  10. 最短路径和最小生成树的区别