此为文章备份,原文出处(我的网站)  [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/08/ado.net4.5_async_await_20140508.aspx

以前的ADO.NET也能作  "异步"(Async,大陆说法:异步),可以参考 KKBruce 2009/11月的文章:

SQLCOMMAND的异步行程

http://blog.kkbruce.net/2009/11/sqlcommand.html

但是, .NET 4.5 & VS 2012(含)后续新版本有新的作法

以下是(节录)MSDN网站的说明:

Visual Studio 2012 引入简化方法 (即异步程序设计),充分运用 .NET Framework 4.5 和 Windows 运行时间 中的异步支持。 编译程序会完成开发人员过去经常要做的困难工作,而您的应用程序仍保有类似同步程序代码的逻辑结构。 因此,您可以轻松地取得异步程序设计的所有优点。

Asynchrony 对可能会进行封锁的活动相当重要,例如,当应用程序存取 Web 时。 对网络资源的存取有时会变慢或延迟。 如果此类活动在同步进程中遭到封锁,整个应用程序就必须等候。 在异步进程中,应用程序可以继续进行其他不相依于 Web 资源的工作,直到可能的封锁工作完成。

Visual Basic 中的 Async Await 关键词,以及 C# 中的 async await 关键词,都是异步程序设计的核心。 您可以使用这两个关键词,在 .NET Framework 或 Windows 运行时间中使用资源建立异步方法,几乎就像建立同步方法一样轻松。 经由 async 和 await 定义的异步方法称为异步方法。

........................................................................................................................................................................

以下采用 ASP.NET为例,用 ADO.NET DataReader来撰写

范例源自「我的书本」里面提供的四大范本

第一,请宣告 System.Threading.Tasks 命名空间

C# ----  using System.Threading.Tasks;

VB ----  Imports System.Threading.Tasks

如果有必要的话,请在您的项目或是网站中,使用 NuGet

搜寻Microsoft.bcl.Async并且安装

接下来的 C#后置程序代码,程序如下

//****请加上 async关键词,在事件前方!!***

protected async void Button1_Click(object sender, EventArgs e)

{

await MIS2000Lab_Async();

}

//*** 自己写的 "异步"函式 ***

//****请加上 async关键词,在函式前方!!***

// VB的写法 -- Protected Shared Async Function MIS2000Lab_Async() As Task(Of System.Threading.Tasks.Task)

protected static async Task MIS2000Lab_Async()

{

SqlConnection Conn = new SqlConnection("您自己的DB链接字符串");

SqlDataReader dr = null;

SqlCommand cmd = new SqlCommand("select author from test", Conn);

try

{

//== 第一,链接数据库。异步的用法只有在.NET 4.5(含)后续新版本

//旧的写法  Conn.Open();   //---- 连结DB

await Conn.OpenAsync();

//== 第二,执行SQL指令。

//旧的写法   dr = cmd.ExecuteReader();   //---- 执行SQL指令,取出数据

dr = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);

//==第三,自由发挥,把执行后的结果呈现到画面上。

==自己写循环==

//旧的写法  while (dr.Read())

while (await dr.ReadAsync())

{

if (await dr.IsDBNullAsync(1))  // 1表示 true,DBNull

{

HttpContext.Current.Response.Write("*** NULL***");

}

else

{

HttpContext.Current.Response.Write(dr["author"] + "<br / >");

}

}

}

//......(未完)...后续的「关闭资源」程序代码没有改变,请参阅书本

关于 ADO.NET的程序范例可以参阅我以前的文章:

[ADO.NET] DataReader的标准范例 for ASP.NET (Code Behind版)

http://www.dotblogs.com.tw/mis2000lab/archive/2008/04/24/3446.aspx

或是我录制的教学影片:https://www.youtube.com/watch?v=zeXgLVqSy50

........................................................................................................................................................................

我们可以发现跟以前的差异

1. 程序代码更简单。拿旧的程序来修改,改变幅度极小。

2. 以前使用的 Begin...方法与 End...方法都不见了,也没有写到 IAsyncResult

程序代码里面有用到 -- CommandBehavior.SequentialAccess

提供方法来让 DataReader 使用大型二进制值来处理含有数据行(字段)的数据列(记录)。 SequentialAccess 并不会加载整个数据列,而是启用 DataReader 来加载数据做为数据流。 然后您可以使用 .GetBytes()或 .GetChars()方法来指定要开始读取作业的字节位置和所传回数据的限制缓冲区大小。

当您指定 SequentialAccess 时,必须以数据行(字段)传回的顺序来读取它们,不过您不需要读取每一个数据行(字段)。 一旦您已经读取过在所传回数据流中的过去数据位置,则在该位置上和该位置之前的数据都无法再从 DataReader 读取。 使用 OleDbDataReader 时,您可以重复读取目前的数据行(字段)值直到读取越过它为止。 使用 SqlDataReader时,您可以只读取数据行(字段)的值。

我的批注:上面划起来的重点,说明了 DataReader「向前顺向(Forward)、只读」的特性。可以参阅我录制的教学影片 -- https://www.youtube.com/watch?v=oY7jd0ABXeM

相关文章,请看:

[ADO.NET] DataReader的标准范例 for ASP.NET (Code Behind) #2 -- CommandBehavior

http://www.dotblogs.com.tw/mis2000lab/archive/2010/12/01/datareader_2_commandbehavior.aspx

[MSDN] CommandBehavior 列举类型

http://msdn.microsoft.com/zh-tw/library/system.data.commandbehavior.aspx

........................................................................................................................................................................

这篇文章的范例最多,也最清楚:[msdn] 异步程序设计

http://msdn.microsoft.com/zh-tw/library/hh211418(v=vs.110).aspx

微软 msdn有很多解说&程序代码范例

使用 Async Await 设计异步程序 (C# Visual Basic)

http://msdn.microsoft.com/zh-tw/library/hh191443.aspx

逐步解说:使用 Async Await 存取 Web (C# Visual Basic)

http://msdn.microsoft.com/zh-tw/library/hh300224.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

Using SqlDataReader’s new async methods in .Net 4.5, Part 2: Examples

http://blogs.msdn.com/b/adonet/archive/2012/07/15/using-sqldatareader-s-new-async-methods-in-net-4-5-beta-part-2-examples.aspx

我另外也参考了这本书(简体中文版),书很薄,但写的很不错。

转载于:https://www.cnblogs.com/mis2000lab/p/3755116.html

[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库相关推荐

  1. asp mysql分页_asp数据库编程:ADO 存取数据库时如何分页显示

    ∈裁词?ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显 ...

  2. 用纯ASP代码实现图片上传并存入数据库中

      用纯ASP代码实现图片上传并存入数据库中    热     ★ 用纯ASP代码实现图片上传并存入数据库中 用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中关于如何上传文件到服务器恐 ...

  3. ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法

    ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法(转载) 10小时前 ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法(转载) 分类: ASP.NET| ...

  4. [ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?

    标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题.这个问题有助于我们深入理解依赖注入框架在ASP.NET Core中的应用,以及服务实例的生命周期. 一.问题重现 我们通过一个简单的实 ...

  5. ASP.NET状缓存Cache的应用-提高数据库读取速度

    ASP.NET状缓存Cache的应用-提高数据库读取速度 原文:ASP.NET状缓存Cache的应用-提高数据库读取速度 一. Cache概述        既然缓存中的数据其实是来自数据库的,那么缓 ...

  6. asp.net mysql helper_asp.net使用SQLHelper操作数据库

    使用控件,能够方便开发人员的开发和使用,但是很多情况下,不能使用控件来实现,所以很多情况都需要使用ADO.NET操作数据库中的数据,SQLHelper是将ADO.NET中对数据操作的类和对象进行的封装 ...

  7. asp.net旅游网站系统VS开发sqlserver数据库web结构c#编程计算机网页项目

    一.源码特点        ASP.NET 旅游网站系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发.开发环境为vs2010,数据库为sqlserver20 ...

  8. asp.net毕业生信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

    一.源码特点         asp.net  毕业生信息管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发.开发环境为vs2010,数据库为sqlse ...

  9. asp.net鲜花网站系统VS开发sqlserver数据库web结构C#编程

    一.源码特点         asp.net鲜花网站系统是一套完善的WEB设计管理系统,系统具有完整的源代码和数据库 ,系统主要采用B/S模式开发. 应用技术:ASP.NET c#+sqlserver ...

最新文章

  1. CVPR2020论文解析:实例分割算法
  2. 【进阶玩法】Angular用emit()实现类似Vue.js的v-model双向绑定[(ngModel)]功能
  3. 和qc哪个发展更好_一图一表让你秒懂什么叫QC/QA/QM
  4. 学Python怎么样 发展前景如何
  5. MANIFEST.MF和feature.xml版本控制规则
  6. 如何在WP-Config中设置WordPress错误日志
  7. LeetCode 2079. 给植物浇水(前缀和)
  8. CPU高负载排查小技巧(2分钟速读版),细心的优化可能为公司节省一个亿!
  9. 2021-2025年中国电动门锁行业市场供需与战略研究报告
  10. linux安装步骤_图解 Debian 10(Buster)安装步骤 | Linux 中国
  11. java中的==和equals的区别
  12. 树莓派 4B 配置 Ubuntu20.04 和 ROS2
  13. SVN版本管理:两种开发模式
  14. 计算机应用教程卢湘鸿,计算机应用教程
  15. AES MODE_GCM
  16. 文通互联网图片文字识别系统
  17. Python 3程序开发指南 (第二版) 中文PDF下载 Programming in Python 3, 2rd Ed - Python - 大家论坛 -...
  18. No.118 Pascal's Triangle ||
  19. 将数组升序排列后,插入一个数,仍然保持升序排列。
  20. PDN建立失败场景(二)

热门文章

  1. Eclipse环境安装Python插件PyDev
  2. fastjson转换json格式数据为ListHashMap转换异常问题
  3. java线程异常终止_java线程莫名异常退出时,如何捕获异常信息
  4. 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
  5. linux对于图形方式的运行级,在大多数Linux发行版本中,图形方式的运行级定义为( )?...
  6. 我的博客学习记录一箩筐(每天更新)
  7. Asp.Net无刷新分页( jquery.pagination.js)
  8. phpstrom php cli,在docker中的PhpStorm 2017.1远程php-cli:配置php.ini文件不存在
  9. 云服务器上划虚拟主机,云服务器上划虚拟主机
  10. AS3的一些压缩解压缩类库(AS3 ZIP、AS3 GZIP等等)