1、同步与异步:同步是阻塞模式,异步是非阻塞模式。
(1)我们平时经常讨论的同步问题多发生在多线程环境中的数据共享问题。即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一特定时刻只能被一个线程所访问,如果使用异步,程序的运行结果将不可预料。因此,在这种情况下,就必须对数据进行同步,即限制只能有一个进程访问资源,其他线程必须等待。
(2)当应用程序在对象上调用一个需要花费很长时间来执行的方法的时候,并且不需要让程序等待对方返回,这是就应该使用异步编程。
2、ADO访问数据库中的异步:
(1)介绍
一般,ADO都是以同步的方式来处理数据。这就是说,当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行。比如,使用ADO打开一个记录集,默认是同步,那么只有从数据库获取到记录集并返回记录集之后,才能继续执行下一行代码。但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时,应用程序仍然能够先继续执行。而当ADO处理数据完毕之后,ADO会以事件的方式通知应用程序,此时应用程序可以再根据ADO执行的结果来采取相应的动作。
(2)什么情况下使用
使用异步执行方式有许多用途,例如,如果应用程序需要处理花费大量时间的动作,那么ADO可以选择以异步执行方式让ADO在后台执行,而让应用程序继续处理图形用户接口或用户输入的数据。
又比如某些数据库操作(例如命令执行)可能要花费很长时间才能完成,而单线程应用程序必须阻塞其他操作,并且等待该命令完成,然后才可以继续执行它们自己的操作,这样有可能会导致应用程序发生假死或卡死。因此使用异步处理,将长时间运行的操作分配给某个后台线程,从而使前台线程在整个操作期间保持活动的响应状态。
a、 如果所有的数据库连接和操作均在同一个主进程中执行,那么恰当的使用异步访问数据库会使应用程序性能得到很好的提高。
b、而如果ADO对数据库的操作使用多线程来执行的话,则无需使用异步来建立连接或者执行SQL,因为实现多线程同步操作数据库与异步执行达到的效果是类似的,因此只需要实现多线程的同步来保证对数据库资源的访问不会出现问冲突即可。
c、至于到底是选择使用异步执行还是使用多线程,如果是一个单线程应用程序,那么使用异步执行无疑是最快速的办法。
3、ADO异步操作的使用
(1)ADO 事件模型支持某些同步和异步的 ADO 操作,在这些操作开始之前或完成之后会产生“事件”(即通知)。事件实际上是对在应用程序中定义的事件处理程序例程的调用。
事件分类:
- ConnectionEvents(从属于Connection对象的操作) — 在连接的事务开始、提交或回卷时,或在 Command 被执行、连接开始或结束时,将引发该类事件。
- RecordsetEvents(从属于 Recordset 对象的操作) — 在 Recordset 对象行中定位、更改 Recordset 行中的字段、更改 Recordset 的行、或是在 Recordset 作任何修改时,将引发该类事件。
(2)事件处理程序概述
ConnectionEvent | 说明 |
---|---|
BeginTransComplete、CommitTransComplete 、RollbackTransComplete | 事务管理 :关于连接上的当前事务已经开始、已经提交、或者已经回卷的通知。 |
WillConnect、ConnectComplete 、 Disconnect | 连接管理 :关于当前连接即将开始、已经开始、或者已经结束的通知。 |
WillExecute、ExecuteComplete | 命令执行管理 :关于连接的当前命令的执行即将开始、或者已经结束的通知。 |
InfoMessage | 信息管理 :关于当前操作有附加信息的通知。 |
RecordsetEvent | 说明 |
---|---|
FetchProgress、FetchComplete | 检索状态 — 关于数据检索操作进度、或者检索操作已经结束的通知。 |
WillChangeField 、FieldChangeComplete | 字段更改管理 — 关于当前字段值即将更改、或者已经更改的通知。 |
WillMove、MoveComplete、EndOfRecordset | 定位管理 — 关于当前行在 Recordset 中的位置即将更改、已经更改、或者已经到达 Recordset 结尾的通知。 |
WillChangeRecord 、RecordChangeComplete | 行更改管理 — 关于 Recordset 当前行的某些地方即将更改、或者已经更改的通知。 |
WillChangeRecordset 、RecordsetChangeComplete | Recordset 更改管理 — 关于当前 Recordset 的某些地方即将更改、或者已经更改的通知。 |
4、由于在学习研究异步的过程中,并未对其深究,且项目中并不需要使用异步,使用多线程解决了问题,所以后续有机会再学习。
由于本人才疏学浅,难免会有错误,如有不对的地方,恳请
各位指正,谢谢!
参考文章:
https://blog.csdn.net/bigpudding24/article/details/49456869
https://www.cnblogs.com/30ErLi/archive/2010/09/16/1828271.html
https://technet.microsoft.com/zh-cn/library/zw97wx20(v=vs.100).aspx
https://docs.microsoft.com/zh-cn/sql/ado/guide/data/ado-event-instantiation-visual-c(这篇作为一个教程详细看看)