欢迎光临
我们一直在努力

在 .NET 中实现异步回调访问数据库

,为了避免同步访问数据时所带来的延迟,我们需要改进设计,以提高程序执行效率。一方面,这可以给用户以良好的使用体验;另一方面,也降低了程序崩溃的可能性。为实现这一目的,我们采用异步方式来访问数据库。        什么是异步呢?简单来说,就是并行执行。它与同步是相对立的,我们平时所有用到的方式大都属于同步执行。比如,在一段程序中,标号为 B 的语句在标号为 A 的语句后面,那行,如果 A 语句没有执行完,那么 B 语句就得不到执行。而异步则不同,我们可以把异步执行理解为轻型线程。当程序在 A 处开始异步执行的时候,主程序继续执行,而异步语句中指定的操作则在后台线程上与主线程同时执行。因此,它提高了程序执行的效率,也减少了阻塞的可能。        实现异步的方法有多种,这里我们采用异步回调方式,使用异步回调时,我们需要实例化 AsyncCallback 委托,这是系统定义的委托。在 .NET 中,提供了一系列用于异步操作的方法。每种异步操作通常包含了两个方法,即 BeginXXX() 和 EndXXX()。比如,我们下面即将要用到的 BeginExecuteReader() 和 EndExecuteReader()。        请看代码(本文采用 C# 语言):using System;using System.ComponentModel;using System.Data;using System.Text;using System.Data.SqlClient;using System.Drawing;using System.Windows.Forms;namespace 异步访问数据库{  //定义一个委托,这个委托在下面显示数据时会用到,它接受一个 DataTable 类型的参数    public delegate void ShowData(DataTable dt);    //窗体类    public partial class UsingCallBack : Form    {        DataSet ds = new DataSet();        ShowData sd; //定义委托变量        public UsingCallBack()        {            InitializeComponent();            this.StartPosition = FormStartPosition.CenterScreen;        }        private void UsingCallBack_Load(object sender, EventArgs e)        {  //为委托指定方法            sd = new ShowData(this.ShowDataFunction);        }        private void button1_Click(object sender, EventArgs e)        {            //定义异步回调委托            AsyncCallback ac=new AsyncCallback(CallbackProcedure);            this.Text = "正在异步读取数据库,您可以执行其它操作...";            //定义数据库变量            SqlConnectionStringBuilder cSB = new SqlConnectionStringBuilder();            cSB.ConnectionString = "Server=.;Initial Catalog=Northwind;Integrated Security=True";     //这一步是最关键的,用 AsynchronousProcessing 的属性来指定是否可以执行异步操作            cSB.AsynchronousProcessing = true;            SqlConnection sqlCon = new SqlConnection(cSB.ConnectionString);            string SQL = "Select * From Orders";            SqlCommand sqlCmd = new SqlCommand(SQL, sqlCon);            sqlCon.Open();  //开始异步读取            sqlCmd.BeginExecuteReader(ac, sqlCmd);                     }//异步回调过程,在异步操作完成时调用,故称回调        public void CallbackProcedure(IAsyncResult ar) {            SqlDataReader sDR;            SqlCommand sqlCmd = (SqlCommand)ar.AsyncState;            sDR = sqlCmd.EndExecuteReader(ar);            ds.Load(sDR, LoadOption.OverwriteChanges, "Result");  //执行委托:这个委托我们在最上面已经定义过,它负责将执行结果显示            Invoke(sd, ds.Tables["Result"]);                   }        public void ShowDataFunction(DataTable dt) {     //将 DataGridView 的 DataSouce 属性值设为传过来的 DataTable            this.DGV.DataSource =dt;        }    }}        通过上述程序,我们可以看到,在异步访问数据库时,我们需要使用对象 SqlConnectionStringBuilder ,只有当该对象的 AsynchronousProcessing 属性为 True 时,我们才能执行异步操作。对于上述程序,如果您有不了解的地方或者改进意见,可以留言;如果需要全部源代码,也可以留言。希望我们能共同交流。

赞(0)
未经允许不得转载:福利吧|福利社|fuliba » 在 .NET 中实现异步回调访问数据库

相关推荐

  • 暂无文章