使用异步回调方式查询数据

原创 2007年09月18日 14:14:00

.NET 1.1,SqlCommand类提供的ExeuteReader()方法用于将CommandText发送到Connection并生成一个SqlDataReader,该方法是一个同步方法,也就是说,在该方法未完成之前,工作线程一直处于阻塞状态,程序不能做其他工作;

.NET 2.0,微软在SqlCommand类中提供了BeginExecuteReader()EndExecuteReader()公共方法实现异步CommandText应答,因此它能够实现在执行命令的过程中允许程序完成其他工作,在网络数据库查询中,这种异步调用方式将使程序在查询大数据量记录时变得更加灵活.

当使用BeginExecuteReader方法后,必须调用EndExecuteReader 方法完成操作并检索命令返回的SqlDataReader.如果命令尚未执行完就调用EndExecuteReader,会导致SqlCommand对象在命令执行完之前一直被阻止.通常,开发人员必须使用BeginExecuteReader方法返回的IasyncResult接口的IsCompleted属性进行轮询,以确认命令是否完成,或者使用返回的IasyncResult借口的AsyncWaitHandle属性,等待一个或多个命令完成.

例如: 注意: 在连接字符串里一定要指定Asynchronous Processing=true;

            SqlConnection sconn = new SqlConnection("Server=.;Database=NorthWind;Integrated Security=SSPI;Asynchronous Processing=true");

            SqlCommand cmd = new SqlCommand("select * from Orders",sconn);

            try

            {

                sconn.Open();

                IAsyncResult result = cmd.BeginExecuteReader();

                while (!result.IsCompleted)

                { }

                SqlDataReader dateReader = cmd.EndExecuteReader(result);

                DataTable dt = new DataTable();

                dt.Load(dateReader);

                this.dataGridView1.DataSource = dt;

            }

            finally

            {

                sconn.Close();

                sconn.Dispose();

            }

 

回调方式

SqlCommand类的BeginExecuteReader公共方法的重载形式中,以下重载形式能够实现在提供回调过程和状态信息的情况下,启动此SqlCommand描述的T-SQL语句或存储过程的异步执行,并从服务器中检索一个或多个结果集.该重载的形式的声明如下

        public IAsyncResult BeginExcuteReader

        {            

            AsyncCallback callback, //表示命令执行完成时调用的AsyncCallback委托,传递空引用以指示不需要回调

            Object StateChangeEventArgs//表示传递到回调过程的用户定义的状态对象。使用AsyncState属性从回调过程内检索此对象

        }

在该重载形式中,.可以从委托过程内或者从应用程序内的其他任何位置调用EndExecuteReader方法;此外,还可以在stateObject参数中传递任何对象,并前回调过程可以使用AsyncState属性检索该信息.

例如:

using System.Diagnostics;

using System.Threading;

private SqlConnection CallBackConn;

        private Stopwatch CallBackWatch = new Stopwatch();

        private delegate void DisplayTimeInfoDelegate(string text);

        private delegate void DisplayDataGridViewDelegate(DataTable table);

        private delegate void DisplayInfoDelegate(string text);

        private void DisplayTimeResults(string text)

        {

            MessageBox.Show(text);

        }

 

        private void DisplayDateResults(DataTable table)

        {

            this.dataGridView1.DataSource = table;

        }

 

        private void HandleCallBack(IAsyncResult result)

        {

            try

            {

                SqlCommand cmd = (SqlCommand)result.AsyncState;

                SqlDataReader dataReader = cmd.EndExecuteReader(result);

                CallBackWatch.Stop();

                string CallBackTime = "所用时间:" + CallBackWatch.ElapsedMilliseconds.ToString() + "毫秒";

                DataTable table = new DataTable();

                table.Load(dataReader);

                DisplayTimeInfoDelegate timeDelegate = new DisplayTimeInfoDelegate(DisplayTimeResults);

                this.Invoke(timeDelegate, CallBackTime);

                DisplayDataGridViewDelegate DataDelegate = new DisplayDataGridViewDelegate(DisplayDateResults);

                this.Invoke(DataDelegate, table);

            }

            catch (Exception MyEx)

            {

                this.Invoke(new DisplayInfoDelegate(DisplayTimeResults), String.Format(MyEx.Message));

            }

            finally

            {

                CallBackConn.Close();

            }

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            Application.DoEvents();

            CallBackConn = new SqlConnection("Server=.;Database=NorthWind;Integrated Security=SSPI;Asynchronous Processing=true");

            SqlCommand cmd = new SqlCommand(" Select * From Orders Order By OrderID DESC", CallBackConn);

 

            try

            {

                CallBackConn.Open();

                CallBackWatch.Start();

                AsyncCallback callBack = new AsyncCallback(HandleCallBack);

                cmd.BeginExecuteReader(callBack, cmd);

 

            }

           catch

            {

                CallBackConn.Close();

            }

        }

 

 

使用异步回调方式查询数据

异步方式在.NET 1.1中,SqlCommand类提供的ExeuteReader()方法用于将CommandText发送到Connection并生成一个SqlDataReader,该方法是一个同步方...
  • ccp5780199
  • ccp5780199
  • 2007年08月17日 09:32
  • 1070

python异步回调函数的实现

说到异步回调函数的应用,最经典的就是ajax。 首先我们回想一下ajax是如何工作的。variable=new XMLHttpRequest(); xmlhttp.onreadystatechang...
  • payinglee
  • payinglee
  • 2013年06月01日 19:48
  • 14731

Clipboard还能玩出花

Clipboard是Android提供的一个系统服务,它提供了一个全局的剪贴板,让文字、图片、数据,在多App间共享成为可能,今天,我们来了解下它的真面目,以及被玩坏的新姿势。老规矩,Google A...
  • x359981514
  • x359981514
  • 2016年11月16日 10:17
  • 8591

android回调的理解------异步任务回调接口

注意,我要放大招了!!哈哈哈哈,开玩笑啦~ 最近一直被回调接口折磨的欲生欲死的,网上看了很多例子,还是不明白有什么作用,最后逼不得已请教了一个朋友(其实我是想自己想明白的 0 0),在博客上整理一下...
  • Anny_Lin
  • Anny_Lin
  • 2015年08月13日 16:26
  • 1999

支付宝接口异步回调不通知 服务器的原因

已经设置了  notify_url的值为  http://www.xxxxx.com/index.php?g=Wap&m=Alipay&a=PayOrderString   用的是 TP框架   ...
  • jj3341332
  • jj3341332
  • 2016年09月30日 17:52
  • 3510

java 回调机制分为:异步回调 同步回调

java 回调机制分为:异步回调   同步回调 模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;...
  • Timebeggar
  • Timebeggar
  • 2016年03月18日 11:32
  • 1374

网络get/post请求异步同步请求回调

教你怎么写网络异步同步请求回调最近需要用到请求网络数据,在网上一直查找,都找不到,要么是说的不明白,之后我自己动手来实现了。网络回调,分为同步和异步,多数情况都会用异步,但是也有情况用到同步的。无论同...
  • a136558
  • a136558
  • 2016年05月12日 18:55
  • 1546

浅析 Angular $q promise 回调异步嵌套解决机制

前言大概一个多个月忙着做公司开发的项目,做这个项目以来有些心得,但是感觉还是不如闷头学来的快,毕竟是实战,在这一个月以来,经历过各种适应布局,还算小有收获,不过最大的遗憾是荒废了angular的学习进...
  • HaoDaWang
  • HaoDaWang
  • 2017年06月19日 10:40
  • 639

【转】JS中的回调与异步

定义回调是什么?看维基的 Callback_(computer_programming) 条目: In computer programming, a callback is a referenc...
  • henry903
  • henry903
  • 2017年03月15日 20:09
  • 584

C# 异步回调

一:回调方法的签名和工作机制    1.回调方法必须要符合以下签名:     void (IAsynResult asynResult);回调的方法的名称的统一规范是在名称前面加On ,如:OnAs...
  • ccx_john
  • ccx_john
  • 2013年12月28日 12:38
  • 612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 使用异步回调方式查询数据
举报原因:
原因补充:

(最多只允许输入30个字)