ADO.NET 异步查询

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

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

         以往编写程序时,我们可以直接通过.NET Framework 所提供的多线程机制,或是以 Delegate 类包装多线程的方式,在 .NET Framework 所提供的异步架构下,设计调用执行 Command 对象实例。这些方法都是让一条工作线程(Worker Thread)停止在后台中等待执行结果,一旦有结果后,工作线程再通过标准的机制告知结果。

         原本 ADO.NET 的 Command 对象执行 SQL 语法的方法有ExecuteReader、ExecuteNonQuery、ExecuteXmlReader 以及 ExecuteScalar 等,搭配 .NET
Framework 原来就提供的异步模型惯例,除了 ExecuteScalar 方法外,其余的方法都新增了以 Begin 和 End 关键字开始的一对方法。也就是说 ExecuteReader 方法是同步执行,若要以异步的方式执行相同的功能,则调用 BeginExecuteReader 和 EndExecuteReader 这一组方法。在 .NET Framework 中,以 Begin 为字首的方法负责传入同名方法所需的参数,而以 End
为字首的方法用来取回执行结果,
例如某个方法的定义如下:
public override int ExecuteNonQuery()
则以异步调用的起始方法定义如下:
public IAsyncResult BeginExecuteNonQuery(AsyncCallback callback, object stateObject)
Begin~ 系列的方法会多加存放回调方法(Delegation)的指针参数,也就是上述语法中的 callback 参数。并提供语法中的 stateObject参数,让你设置想要带到 End~ 对应方法的信息。而 Begin~ 系列方法最后返回的是代表异步执行状态的 IAsyncResult 对象实例,而不是原本同步执行方法的返回结果,你可以藉此查询异步执行的状况。
 
而获得执行结果的方法定义如下:
public int EndExecuteNonQuery(IAsyncResult asyncResult)
在调用与 Begin~ 对应的 End~ 方法时,需要带入 Begin~ 方法所返回的 IAsyncResult
对象实例。异步执行完毕后,取回与原先同步执行方法相同的执行结果。
 
由于我们在执行完 Command 对象访问数据库的方法后,都会返回对象,如 ExecuteReader 取回 DataReader实例;ExecuteNonQuery 取回受影响的记录条数;ExecuteXmlReader 取回 XmlReader 实例。因此大概都需要通过End系列方法来获得执行结果,否则这些结果就遗失在系统中。
若要异步执行 Command 命令,另一个必需设置的是:数据库连接字符串内要加上 async=true 属性。若连接字符串没有加上该属性,而通过 Command对象实例调用异步执行的方法,则会产生异常(exception)。若 Command 通过连接执行时,重头到尾都是以同步的方式执行,则依照默认 async=false 的方式设置比较节省资源。若某些命令需要同步执行,另一些需要异步执行,则可以考虑使用不同的连接。
在介绍范例应用程序前,我们先稍微谈一下 .NET Framework 所提供的公共的异步运行应用程序设计模式,不只是 ADO.NET2.0,在其他访问耗时的程序编写上,也都可以套用这个模式。
.NET Framework内置了让应用程序异步运行的功能,让你在编写应用程序时,不会因为某些耗时等待的操作让程序停止响应,操作界面停滞让用户感觉起来好像死机一样。一般会以多线程的方式处理这种需求,但若你不熟悉线程的运行,或是想利用线程池(Thread Pool)的好处,都可以在较为耗时的操作上,采用 .NET Framework 所提供的异步功能。
一般来说文件 I/O、网络访问乃至于 Web Services 访问,以及本节所讨论的 DB 访问等都较为耗时,.NET Framework为这一类的类都提供了上述以 Begin~/End~开头的非同步执行方法,而这些方法皆成对出现。当然,也有可能是自己编写的方法其商业逻辑非常复杂,导致调用该方法后,需要等待一段时间来完成,这时还可以通过 .NETFramework 所提供的委托(Delegate)类来创建异步运行。
 
但是实际在我们的应用中,
但我们不需要获知DB服务器的返回信息时,我们推荐使用委托,尤其是在Web开发中。
因为在页面线程启动异步数据库访问时,当页面业务执行完毕后仍然无法放开访问数据库的异步线程。这是我们不希望看到的,但是使用委托却可以避免这个麻烦(webservice异步应用中一样如此)。

http://technet.microsoft.com/zh-cn/library/zw97wx20(v=vs.100).aspx

http://blog.csdn.net/oyjd614/article/details/1828043

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值