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

时间:2009-11-17 19:52来源:网络收集 作者:佚名 点击: 334 次 技术论坛
某些场合下,在对数据库进行访问时,为了避免同步访问数据时所带来的延迟,我们需要改进设计,以提高程序执行效率。一方面,这可以给用户以良好的使用体验;另一方面,也降低了程序崩溃的可能性。为实现这一目的,我们采用异步方式来访问数据库。 什么是异步

某些场合下,在对数据库进行访问时,为了避免同步访问数据时所带来的延迟,我们需要改进设计,以提高程序执行效率。一方面,这可以给用户以良好的使用体验;另一方面,也降低了程序崩溃的可能性。为实现这一目的,我们采用异步方式来访问数据库。
        什么是异步呢?简单来说,就是并行执行。它与同步是相对立的,我们平时所有用到的方式大都属于同步执行。比如,在一段程序中,标号为 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 时,我们才能执行异步操作。
对于上述程序,如果您有不了解的地方或者改进意见,可以留言;如果需要全部源代码,也可以留言。希望我们能共同交流。

转载于:https://www.cnblogs.com/baiyu/archive/2011/08/31/2160961.html

转:在 .NET 中实现异步回调访问数据库相关推荐

  1. java 中的异步回调

    异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...

  2. ES6中的异步对象Promise

    回忆一下ES5中的怎么使用异步方法 // es5中的异步回调let ajax = function(callback){console.log('执行') // 执行setTimeout(() =&g ...

  3. Java 异步回调机制实例解析

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调是一种特殊 ...

  4. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  5. java 异步通知_Java 异步回调机制实例解析

    什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道"就一个回调-".此时千万个草泥马飞奔而过 哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉.不妨总结总结. 一.什么 ...

  6. 内存泄漏,关于异步回调导致的内存泄漏,使用LeakCanary检测内存泄漏

    在任何程序开发中,异步操作的处理都是一个麻烦事,而在 Android 中更繁杂一些,这是由于 Android 基于组件的设计对异步操作不够友好.所以,如果你在 Android 中开发界面,不妥善处理全 ...

  7. 异步回调需要注意的问题

    如果有人问我,Android 程序什么时候最容易出错?一个备选答案(额,这个备选集可能会有点长...):在界面开发中使用了异步回调.在任何程序开发中,异步操作的处理都是一个麻烦事,而在 Android ...

  8. 警惕界面上的异步回调

    2019独角兽企业重金招聘Python工程师标准>>> 如果有人问我,Android 程序什么时候最容易出错?一个备选答案(额,这个备选集可能会有点长...):在界面开发中使用了异步 ...

  9. #Effective Android# 警惕界面上的异步回调(No.2)

    个人评论:真心不错的一篇文章,以后coding,以及写基础框架又多了一些考虑点. 作者:范怀宇 链接:https://zhuanlan.zhihu.com/p/20214237 来源:知乎 如果有人问 ...

最新文章

  1. C#使用BerkeleyDB操作简介
  2. puppet recurse 导致的性能问题一例
  3. 嵌入式C语言代码规范
  4. 行走方案问题(动态规划实现)
  5. 文巾解题 1433. 检查一个字符串是否可以打破另一个字符串
  6. 修改代码的艺术----- 2.2 高层测试 2.3 测试覆盖
  7. java语言和www技术 阶段性测试一_2018春季【贵州电大】[JAVA语言与WWW技术(省)]04任务阶段性测验(答案)...
  8. 网络字节与主机字节转换 htons(), ntohl(), ntohs(),htons() 函数
  9. ORACLE数据库基本操作命令
  10. df=df.reset_index(drop=True)
  11. 一场改变你投资生涯的讨论:职业德州扑克手看交易
  12. pytorch tensor操作:tensor与numpy转换
  13. Linux中的僵尸进程处理
  14. Active Directory 域服务(AD DS)
  15. 物联网中的密码安全风险
  16. python九宫格拼图游戏
  17. 百度墨卡托经纬度互转工具类
  18. MATLAB读取EXCEL表格文件,并进行可视化
  19. qq邮箱html源码,qq邮箱源码
  20. 硬盘开盘证明怎么写,开盘证明范本

热门文章

  1. Docker入门六部曲——服务
  2. 2022年新能源汽车产业集群百人会
  3. GPU与CPU交互技术
  4. CUDA 7流简化并发
  5. 横竖屏切换时Activity的生命周期
  6. Android runOnUiThread() 方法的使用
  7. CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现滑动某一个固定的距离
  8. Android RatingBar
  9. 网络2网络布线与数制转换
  10. MyBatis-Spring(四)--MapperFactoryBean实现增删改查