2022年异步访问数据库 .pdf
《2022年异步访问数据库 .pdf》由会员分享,可在线阅读,更多相关《2022年异步访问数据库 .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、异步访问数据库?异步数据访问能够极大地提高应用程序的性能?在使用异步访问时,能够同时执行多条命令?通过使用轮流检测技术或委派技术,异步数据访问中能得到命令已经完成的通知?同步代码更容易编写,因为它在本质上是过程化的。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Configuration;using S
2、ystem.Data.SqlClient;namespace AsynchAccess publicpartialclassForm1:Form publicstaticint i=0;publicstaticint j=0;public Form1()InitializeComponent();privatevoid button1_Click(object sender,EventArgs e)i+;string ver=null;SqlConnectionStringBuilder cnSettings;cnSettings=new SqlConnectionStringBuilder(
3、Data Source=.;+Database=master;+Integrated Security=True;+Max Pool Size=5);using (SqlConnection cn=new SqlConnection(cnSettings.ConnectionString)cn.Open();using (SqlCommand cmd=cn.CreateCommand()cmd.CommandText=WaitFor Delay 00:00:05 Select Version;ver=第 +i.ToString()+次调用:+(string)cmd.ExecuteScalar(
4、);名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -label1.Text=ver;privatevoid button2_Click(object sender,EventArgs e)SqlConnectionStringBuilder cnSettings;cnSettings=new SqlConnectionStringBuilder(Data Source=.;+Database=master;+Integrated Security=True;+Max Pool Size=5;+async=true);SqlConnection cn=new SqlCo
5、nnection(cnSettings.ConnectionString);cn.Open();SqlCommand cmd=cn.CreateCommand();cmd.CommandText=WaitFor Delay 00:00:05 Select Version;cmd.BeginExecuteReader(new AsyncCallback(ProcessResult),cmd);publicvoid ProcessResult(IAsyncResult ar)j+;SqlCommand cmd=(SqlCommand)ar.AsyncState;using (cmd.Connect
6、ion)using (cmd)string ver=null;SqlDataReader rdr=cmd.EndExecuteReader(ar);if (rdr.Read()ver=第 +j.ToString()+次调用:+(string)rdr0;label1.BeginInvoke(new LabelHandler(UpdateLabel),ver);publicdelegatevoidLabelHandler(string text);publicvoid UpdateLabel(string text)名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -labe
7、l1.Text=text;C#异步调用的好处和方法最经公司工作需要调用一个外部的webservice,同时要将传出的数据进行保存,以自己以前的习惯,就打算逐步操作,失败啊,完全没考虑过用户体验效果,在同事指点下,意识到使用异步调用的好处,随便将自己找的一些资料留以保存,以戒后误!我们要明确,为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了。异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不
8、会死掉了。异步如何开始,好理解,现在我们讨论的是如何结束这个异步出来的新线程。首先,异步出来的新线程,必须回收,不回收是浪费资源的可耻行为,.NET 也是不允许的,所以你别想钻空子,俗话说,请神容易送神难,就是这个道理。下面你可以很容易想到,回收分为2 种情况:主动回收和被动回收(当然,这是我自己的理解,微软可不是这么说的),主动回收就是,你去监视那个线程,并且等待,当异步方法完成了,就把异步线程回收,焦点回归主线程,实际上就是上篇文章C#异步初步的那种情况,BeginInvoke 之后又 EndInvoke,如果在EndInvoke 的时候,该异步线程没有完成操作,那么整个程序,包括主线程,
9、又在阻塞了,又会出现界面“死”的情况。要想解决这个问题,就使用“被动回收”方式,其中一个重要的办法就是“异步回调”。核心有二:A、用回调函数(本例中为CallBackMethod),异步结束后,自动调用此回调函数。B、而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke。此种方法,是在回调函数中调用EndInvoke 的。异步回调的大概流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最后当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了。下面是搜藏的代码:/首先准备好,要进行异
10、步的方法(能异步的,最好不多线程)private string MethodName(int Num,out int Num2)Num2=Num;return HelloWorld;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -/程 序 终 点/异 步 完 成 时,执 行 的 方 法(回 调 方 法),此 方 法 只 能 有 IAsyncResult一 个 参 数,但 是 该 参 数 几 乎 万 能,可 以 传 递 object private void CallBackMethod(IAsyncResult ar)/从 异 步 状 态 ar.AsyncState中
11、,获 取 委 托 对 象DelegateName dn=(DelegateName)ar.AsyncState;/输 出 参 数int i;/一 定 要 EndInvoke,否 则 你 的 下 场 很 惨string r=dn.EndInvoke(out i,ar);MessageBox.Show(异 步 完 成 喽!i 的 值 是 i.ToString(),r的 值 是 r);/定 义 与 方 法 同 签 名 的 委 托private delegate string DelegateName(int Num,out int Num2);名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页
12、,共 10 页 -/程 序 入 口private void Run()/实 例 化 委 托 并 初 赋 值DelegateName dn=new DelegateName(MethodName);/输 出 参 数int i;/实 例 化 回 调 方 法/把 AsyncCallback看 成 Delegate你 就 懂 了,实 际 上 AsyncCallback是 一 种 特 殊 的 Delegate,就 像 Event似 的AsyncCallback acb=new AsyncCallback(CallBackMethod);/异 步 开 始/如 果 参 数 acb换 成 null则 表 示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年异步访问数据库 2022 异步 访问 数据库
限制150内