热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#如何异步查询数据库

以前在学习Socket的时候,经常会使用到异步操作,孰不知将异步用到数据库查询上也是一把利器,特别是在大数据量查询的时候效果应该是比较明显的。我顺便写了一个小例子,供大家参考。

      以前在学习Socket的时候,经常会使用到异步操作,孰不知将异步用到数据库查询上也是一把利器,特别是在大数据量查询的时候效果应该是比较明显的。我顺便写了一个小例子,供大家参考。

      我们平时默认使用的查询是同步的,也就是说一方不等待另一方做好准备,当查询时间过长时,客户端会被一直阻塞在这里而不能做其他事情。而当我们使用异步时,程序并不会阻塞或挂起线程,它会通过一个代理的回调方法完成查询,主线程将会继续执行,这样便解决了同步所不能做到的并行执行的结果。

  代码如下所示:

  

 1 public partial class AsyncSearchForm : Form
2 {
3 #region --Delegates--
4 private delegate void DisplayTimeInfoDelegate(string text);
5 private delegate void DisplayDataGridViewDelegate(DataTable myTable);
6 private delegate void DisplayInfoDelegate(string text);
7 #endregion
8
9 #region --Fields--
10 private SqlConnection mConnection;
11 private Stopwatch mWatch;
12 private DisplayTimeInfoDelegate myTimeDelegate;
13 private DisplayDataGridViewDelegate myDataDelegate;
14 #endregion
15
16 #region --Constructor--
17 public AsyncSearchForm()
18 {
19 InitializeComponent();
20 mWatch = new Stopwatch();
21 myDataDelegate = new DisplayDataGridViewDelegate(DisplayDataResults);
22 myTimeDelegate = new DisplayTimeInfoDelegate(DisplayTimeResults);
23 button_DoSearch.Click += new EventHandler(Button_DoSearch_Click);
24 }
25 #endregion
26
27 #region --Event Methods--
28 ///
29 /// 当点击执行查询时发生
30 ///

31 private void Button_DoSearch_Click(object sender, EventArgs e)
32 {
33 Application.DoEvents();
34 string cOnnectionString= @"Data Source=127.0.0.1;Integrated Security=SSPI;Database=Northwind;Asynchronous Processing=true";
35 mCOnnection= new SqlConnection(connectionString);
36 string sqlString = "select * from Orders";
37 SqlCommand command = new SqlCommand(sqlString, mConnection);
38 mConnection.Open();
39 mWatch.Start();
40 AsyncCallback callBack = new AsyncCallback(HandleCallback);//注册回调方法
41 //开始执行异步查询,将Command作为参数传递到回调函数以便执行End操作
42 command.BeginExecuteReader(callBack, command);
43 }
44 #endregion
45
46 #region --Private Methods--
47 ///
48 /// 异步查询的回调方法
49 ///

50 /// 异步操作状态
51 private void HandleCallback(IAsyncResult MyResult)
52 {
53 try
54 {
55 SqlCommand command = (SqlCommand)MyResult.AsyncState;
56 SqlDataReader reader = command.EndExecuteReader(MyResult);
57 mWatch.Stop();
58 string callBackTime = mWatch.ElapsedMilliseconds.ToString() + "毫秒";
59 DataTable dataTable = new DataTable();
60 dataTable.Load(reader);
61 this.Invoke(myTimeDelegate, callBackTime);
62 this.Invoke(myDataDelegate, dataTable);
63 }
64 catch (Exception MyEx)
65 {
66 this.Invoke(new DisplayInfoDelegate(DisplayTimeResults), String.Format(MyEx.Message));
67 }
68 finally
69 {
70 if (mConnection != null)
71 {
72 mConnection.Close();
73 }
74 }
75 }
76
77 ///
78 /// 在Label上显示信息
79 ///

80 ///
81 private void DisplayTimeResults(string text)
82 {
83 this.label_Time.Text = label_Time.Text + text;
84 }
85
86 ///
87 /// 绑定数据到DataGridView
88 ///

89 ///
90 private void DisplayDataResults(DataTable myTable)
91 {
92 this.dgv_Data.DataSource = myTable;
93 }
94 #endregion
95 }

  运行结果如下所示:

  代码很简单,没有很多的东西。数据库我使用了Northwind,这次查询用了4毫秒,在这样短的查询耗时下,异步对程序作用是不明显的,真正使用时还需具体问题具体分析。需要提醒大家的是异步操作是普遍存在的,但异步方式也需要某种程度的协调,异步看似效率高无阻塞,但若程序在还没得到查询结果的时候就调用了使用查询结果的方法就会出错。因此还可以使用ManualResetEvent手动给线程指定阻塞和非阻塞的信号,这样各个线程之间就可以等待彼此的信号达到同步目的,有兴趣的朋友可以试试,我在这就不再赘述了。最后送大家一句话:“异步有风险,使用需谨慎。”


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
author-avatar
1983热爱生活
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有