当前位置: 首页 > 编程日记 > 正文

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

在 .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

相关文章:

《资安人》:迈向成功SOC之路

近日,台湾的《资安人》上发表了一篇文章——《迈向成功的SOC之路》,现转载至此,以飨读者。【作者:王榮信 -11/08/2010】在現代虛擬世界中,造成資訊安全事件的來源為病毒、蠕蟲或木馬,不變的安全事件來源就是…

Laravel 上使用 phpexcel的两种方式

原创 2017年06月24日 20:24:311229文章采集与网上 方式1。使用原生的phpexcel , http://blog.csdn.net/CSwfe/article/details/52748046?locationNum1 1、在app目录下创建一个新的文件夹,命名libs(可自定义) app/libs/phpExcel2…

剑指offer-----Python-----栈

用两个栈实现队列 题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中元素为int类型. 首先,栈都是先进后出,但是队列呢,一般是先进先出。也就是创建两个栈stack1和stack2,使用两个“先进后出”的…

【工具软件】markdown编译器待办事项无法打勾

使用时可以直接点击上方工具栏的 List item 注意:此时已经自动在里面加了一个空格,如果直接加x的话,不会打勾,如下:[ x] List item 所以先删除空格在加x 问题解决

【转】创建不可见的Activity

在android开发中有时候会用到一些后台的Activity,但又不适合使用service,比如直接点击程序图标时只是执行一段代码,不需要弹出程序界面。此时可以在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行:android:the…

关于 TApplication 详解 三 ---- TComponent

ComponentCount属性 对应对象:所有组件 声明:property ComponentCount: Integer; 功能:此属性在运行时有效,它是只读型。同时它标明组件具有的组件数。当用户在设计时可以在窗体上放置一个组件,因此此窗体将变为…

[转载] K3 K3c 最简单无损开壳方法

只用一把螺丝刀就行了,其它什么撬棒 信用卡 撬片等 拆机工具一概不用。拆了5台,只有一台断了一个扣口。1. 把底部4个螺丝拿掉。2.把路由如图放在桌子上,路由平行于身体,注意是立着放 使路由与桌子接触的部分成30度角。这样使一侧…

图像处理随笔知识

采样频率: 采样频率是指1s内采样的次数,反映了采样点之间的间隔大小。 采样频率越高,得到的图像样本越逼真,图像质量越高,但要求的存储量也越大。 图像量化: 要用多大范围的数值来表示图样采样之后的每一个…

一则android软件开发工程师的招聘信息

岗位职责: 从事Android平台的客户端软件开发 任职资格: 1、一年以上Android平台开发经验; 2、两年以上Java开发经验; 3、熟悉Android开发架构和API调用; 4、熟悉HTTP、TCP/IP通讯协议; 5、熟悉面向对象编程…

【数据库】数据库基本操作

操作练习: 创建数据库 删除数据库 修改数据库配置 创建数据表 修改表结构 ———————————— 添加字段 修改字段 重命名字段 更改主键 删除字段 ———————————— 重命名表名 删除表 截断表 表数据的操作 添加数据 修改数据 删除数…

USERADD命令详解

2019独角兽企业重金招聘Python工程师标准>>> 1.作用useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是终极用户。2.格式useradd [-d home] [-s shell] [-c comment] [-m [-k templat…

tensorflow入门(二)

import numpy as np import tensorflow as tf import matplotlib.pyplot as plt#使用numpy生成200个随机点 x_data np.linspace(-0.5,0.5,200)[:,np.newaxis] noise np.random.normal(0,0.02,x_data.shape) y_data np.square(x_data) noise#定义两个placeholder x tf.plac…

DRF序列化和反序列化

一、自定义序列化组件 新建一个任意名的py文件,里面导入serlizerfrom rest_framework import serializers自定义一个类继承serializers,里面写需要序列化的字段方法一:继承serializers.Serializerclass BookSerlizer(serializers.Serializer)…

设计模式学习笔记-中介模式

概述: 用中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以对立地改变他们之间的…

【数据库】兴唐第二十七节课之jdbc的使用

使用jdbc修改数据库表中的信息 package java27practice;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {Connection conn null;Stat…

windows 2008 R2无法创建性能收集器

问题: 检查排除方法: 1.确保用户有权限 Http://technet.microsoft.com/zh-cn/library/cc749154(WS.10).aspx (参考: 2.确保 Distributed Transaction Coordinator服务 及Task Scheduler服务有启动。 3.检查 C:\Windows\System32\T…

Silverlight WCF RIA服务(二十三)Silverlight 客户端 4

DomainDataSource WCF RIA Services提供DomainDataSource控件来简化用户界面和域上下文中数据的交互。通过DomainDataSource,我们可以只是用声明性语法来检索、编辑数据。我们指定域上下文与DomainDataSource一起使用,然后通过这个上下文来调用操作。Dom…

Storm Trident示例function, filter, projection

以下代码演示function, filter, projection的使用,可结合注释 省略部分代码,省略部分可参考:https://blog.csdn.net/nickta/article/details/79666918 FixedBatchSpout spout new FixedBatchSpout(new Fields("user", "score…

解决 sh: java: command not found 问题

在执行脚本上加入如下配置即可#!/bin/bashJAVA_HOME/usr/java/jdk1.8.0_152export PATH$PATH:$JAVA_HOME/bin转载于:https://www.cnblogs.com/jimw/p/11126437.html

【数据库】 兴唐第二十七节课只sql注入

首先来一个用户登录程序 public static void login(String username, String password) {Connection conn null;Statement stat null;ResultSet rs null; try {Class.forName("com.mysql.jdbc.Driver");String url "jdbc:mysql://127.0.0.1:3306/tyrantfor…

SIEM部署的几条最佳实践

2010年11月12号,NetworkWorld发表了一篇文章——《SIEM部署的最佳实践》,业界同仁给出了他的一些建议。 这些建议主要是针对Verizon2010年的那个DBIR报告中提到的日志缺失造成的严重问题。 至于建议,主要有: 1)先要搞明…

ffmpeg解码视频存为BMP文件

ffmpeg解码视频存为BMP文件 分类&#xff1a; ffmpeg2011-07-28 12:13 8人阅读 评论(0) 收藏 举报view plain#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma once #ifdef __cplusplus extern …

(四)Asp.net web api中的坑-【api的返回值】

&#xff08;四&#xff09;Asp.net web api中的坑-【api的返回值】 原文:&#xff08;四&#xff09;Asp.net web api中的坑-【api的返回值】void无返回值IHttpActionResultHttpResponseMessage自定义类型我这里并不想赘述这些返回类型&#xff0c; 可以参考博文http://blog.c…

如何提高编程能力?

其实很多人学编程都会遇到困难&#xff0c;我觉得其中一个根本原因是他们没搞明白学编程到底是学什么。编程不是一种知识&#xff0c;而是一门手艺。我们从小到大的学习都是学习知识&#xff0c;流程一般是课前看书预习&#xff0c;上课听讲&#xff0c;下课做作业&#xff0c;…

【HTML】兴唐第二十八节课之初识HTML

1、HTML&#xff1a;hyper text markup language&#xff08;超级文本标记语言&#xff09;算编程&#xff0c;但HTML不是编程语言 2、注意&#xff1a; &#xff08;1&#xff09;所有的HTML文件都是以.html或者htm作为扩展名 &#xff08;2&#xff09;html文件需要被浏览…

Nagios插件NDOUtils安装

1.DBI的安装# wget http://www.cpan.org/modules/by-module/DBI/DBI-1.608.tar.gz # tar zxvf DBI-1.608.tar.gz # cd DBI-1.608# perl Makefile.PL# make# make test# make install2.DBD的安装# wget http://www.cpan.org/modules/by-module/DBD/DBD-mysql-4.011.tar.gz # tar…

maven 获取pom.xml的依赖---即仓库搜索服务

常用仓库地址&#xff1a; http://repository.sonatype.org/ (https://repository.sonatype.org/)如下图&#xff1a; http://www.mvnrepository.com 转载于:https://www.cnblogs.com/hblthink/p/8643137.html

XFile 关键帧动画的解析遇到的问题

一、mesh 数据储存方式的修改 由于在设计CXFileMesh类时考虑不够全面&#xff0c;原CXFileMesh 类内部储存mesh数据采用的是vector模板。这使后来试图为该类添加支持3dsmax关键帧动画功能时带来很大麻烦。最后还是对CXFileMesh 类做了整体修改&#xff1a;用二叉树储存mesh数据…

【HTML】兴唐二十八节课之常用标签(不定期更新)

部分属性的详细参数见菜鸟教程 &#xff08;1&#xff09;换行 <br/> (2)字体设置颜色和大小 <font size 6 color blue>小米巨能写</font> &#xff08;3&#xff09;添加图片 <img src "index.jpg" width "300px"> 注&…

Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?

这是因为Python3中&#xff0c;str的输出是调用类的实例方法__str__来输出&#xff0c;如果__str__方法没有重写&#xff0c;则自动继承object类的__str__方法&#xff0c;而object类的__str__方法是调用__repr__方法&#xff0c;因此自定义类未重写__str__方法的情况下&#x…