使用.net Core 3.1 多线程读取数据库
第一步:先创建一个DBhepler类,作为连接数据库中心,这个不过多说明,单纯作为数据库的连接...........
1 public static string Constr = "数据库连接字符串";
2 public static DataTable Select(string sql, SqlParameter[] sp)
3 {
4 using (SqlConnection conn = new SqlConnection(Constr))
5 {
6 conn.Open();
7 DataTable dt = new DataTable();
8 SqlCommand cmd = new SqlCommand(sql, conn);
9 if (sp != null)
10 {
11 cmd.CommandType = CommandType.StoredProcedure;
12 cmd.Parameters.AddRange(sp);
13
14 }
15
16 SqlDataAdapter sdr = new SqlDataAdapter(cmd);
17 sdr.Fill(dt);
18 conn.Close();
19 return dt;
20 }
21
22 }
第二步:将读取的DataTable,数据信息转换为List
1 public static IList<T> TableToListModel<T>(DataTable dt)
2 where T : new()
3 {
4
5
6 IList<T> ts = new List<T>();// 定义集合
7
8 foreach (DataRow dr in dt.Rows)
9 {
10
11 lock (obj_Lock)//就给锁住,注意这里是要加锁的,虽然我执行的时候没加锁,也成功了,但还是要加上............具体原因,你猜....
12 {
16 T t = new T();
17 PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
18 foreach (PropertyInfo pi in propertys)
19 {
20 //获取属性名称
21 String name = pi.Name;
22 if (dr.Table.Columns.Contains(name))
23 {
24 //非泛型
25 if (!pi.PropertyType.IsGenericType)
26 {
27 pi.SetValue(t, string.IsNullOrEmpty(dr[name].ToString()) ? null : Convert.ChangeType(dr[name], pi.PropertyType), null);
28 }
29 //泛型Nullable<>
30 else
31 {
32 Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
33 //model属性是可为null类型,进行赋null值
34 if (genericTypeDefinition == typeof(Nullable<>))
35 {
36 //返回指定可以为 null 的类型的基础类型参数
37 pi.SetValue(t, string.IsNullOrEmpty(dr[name].ToString()) ? null : Convert.ChangeType(dr[name], Nullable.GetUnderlyingType(pi.PropertyType)), null);
38 }
39 }
40 }
41 }
42 ts.Add(t);
43
44 }
45 }
46 return ts;
47 }
第三步 :为了能够将代码打印出来,,更好的展示效果,我试图用以下方法展示
public static IList<GHXX> zhuanhaun(string sql)
{
DataTable dt = DBHelper.Select(sql, null); IList<GHXX> gHXXes = TableToListModel<GHXX>(dt); return gHXXes;
} public static void showlist(string sql, int index)
{
IList<GHXX> gHXXes = zhuanhaun(sql);
for (int i = 0; i < gHXXes.Count; i++)
{
Console.WriteLine("序号:{0},我来自第{1}个线程,编号:{2},类别:{3},门诊编号:{4},姓名:{5}", i, index, gHXXes[i].MENZH, gHXXes[i].LEIB
, gHXXes[i].MENZKS, gHXXes[i].XINGM);
} }
第四步:接下来就是启动线程执行了
1 Stopwatch sw = new Stopwatch();
2 sw.Start();
3 string sql1 = " 查询的SQL1";
4 string sql2 = "";
5 string sql3 = "";
6 string sql4 = "";
7
8
9 TaskFactory taskFactory = new TaskFactory();
10 List<Task> taskList = new List<Task>();
//我开启了四个线程执行
11 taskList.Add(taskFactory.StartNew(() =>
12 {
13 showlist(sql1, 1);
14 }));
15
16 taskList.Add(taskFactory.StartNew(() =>
17 {
18 showlist(sql2, 2);
19 }));
20 taskList.Add(taskFactory.StartNew(() =>
21 {
22 showlist(sql3, 3);
23 }));
24 taskList.Add(taskFactory.StartNew(() =>
25 {
26 showlist(sql4, 4);
27 }));
28
29
30 sw.Stop();
31 TimeSpan ts2 = sw.Elapsed;
33 Task.WaitAny(taskList.ToArray());//也可以限时等待
34 Console.WriteLine("其中一个线程执行完毕....");
35
36
37 Task.WaitAll(taskList.ToArray());
38 Console.WriteLine("线程全部执行完成,运行时间:" + ts2.TotalMilliseconds);
所以就好了..............
然后执行
开启四个线程查询8000条数据,耗时如图所示
没用启用线程执行,耗时:
使用.net Core 3.1 多线程读取数据库的更多相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- Java多线程读取大文件
前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
- 学习ASP.NET Core Razor 编程系列六——数据库初始化
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- asp.net core系列 31 EF管理数据库架构--必备知识 反向工程
一. 反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...
- .NET Core在类库中读取配置文件appsettings.json
在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...
- spring读取数据库的配置信息(url、username、password)时的<bean>PropertyPlaceholderConfigurer的用法
用法1: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
- C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌
1. IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...
- codeigniter读取数据库的公共配置并全局缓存的实现方案
引言 学习CodeIgniter大概有几天了.从第一天了解后,对CI情有独钟,比较符合我的风格.其实一直以来对框架这块不太敏感.自己长时间的开发,也有一套自己的开发风格和习惯.但是这年头,你说你不会框 ...
随机推荐
- Python小白的数学建模课-05.0-1规划
0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...
- 你是不是对MD5算法有误解?
大家常听到"MD5加密"."对称加密"."非对称加密",那么MD5属于哪种加密算法? 面试问这样的问题,准是在给你挖坑. "MD5 ...
- eclipse集成processing、PApplet、proclipsing 问题
最近老是换应用平台,将processing里的代码转移到eclipse中. processing 关于转换成eclipse的介绍也可以使用,但是没有介绍具体怎么使用第三方库 Processing in ...
- 优雅关闭springboot应用
1.添加钩子函数,钩子函数中指定要调用的方法 @PostConstruct public void run() { this.zkClient.start(this); this.schedulerS ...
- Visual SLAM
Visual SLAM 追求直接SLAM技术,而不是使用关键点,直接操作图像强度的跟踪和映射. 作为直接方法,LSD-SLAM使用图像中的所有信息,包括边缘,而基于关键点的方法只能在拐角处使用小块.这 ...
- CVPR2020:点云分析中三维图形卷积网络中可变形核的学习
CVPR2020:点云分析中三维图形卷积网络中可变形核的学习 Convolution in the Cloud: Learning Deformable Kernels in 3D Graph Con ...
- 摆脱鼠标之Dos学习
2015/12/24 for循环 1,创建文件 http://blog.csdn.net/wangxingbao4227/article/details/17009447 关于for循环的总结,很详细 ...
- Redis五种基础与三种高级数据结构解析
记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...
- .NET 6 亮点之工作负载,它是统一 .NET 的基础
随着.NET 6 Preview 5的发布,大家认真的看相关文章或者是动手做一个MAUI示例的时候就会碰到一个新概念工作负载(workload),相关规范参见 https://github.com/d ...
- Map集合中的方法
Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...