博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库
阅读量:5135 次
发布时间:2019-06-13

本文共 3128 字,大约阅读时间需要 10 分钟。

此为文章备份,原文出处(我的网站) 

 

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

 

但是, .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的程序范例可以参阅我以前的文章:

或是我录制的教学影片:

 

 

 

 

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

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

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

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

 

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

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

 

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

 

我的批注:上面划起来的重点,说明了 DataReader「向前顺向(Forward)、只读」的特性。可以参阅我录制的教学影片 -- 

 

 

 

相关文章,请看:

 

 

 

 

 

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

 

这篇文章的范例最多,也最清楚:

 

 

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

 

 

 

 

 

我另外也参考了这本书,书很薄,但写的很不错。

 

 

 

 

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

你可能感兴趣的文章
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>
企业级应用与互联网应用的区别
查看>>
itext jsp页面打印
查看>>
Perl正则表达式匹配
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
第一篇博客
查看>>
网站搭建(一)
查看>>
Spring JDBCTemplate
查看>>
Radon变换——MATLAB
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>