使用.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情有独钟,比较符合我的风格.其实一直以来对框架这块不太敏感.自己长时间的开发,也有一套自己的开发风格和习惯.但是这年头,你说你不会框 ...
随机推荐
- Go语言的函数01---概念
package main import "fmt" /* 向某人致以问候 参数: name string类型,要问候的对象 n int类型,要问候的次数 返回值: string类型 ...
- 学习Python中出现的错误集合(不定时更新)jupyter平台
出现的问题:1. 本图的错误,一个是line 7 init的两侧应该是是双下划线"__"导致所示错误 2. 本图的错误是 line 12 Student.student_tatal ...
- 自定义 DataLoader
自定义 DataLoader 如 数据输入 一文所介绍,OneFlow 支持两种数据加载方式:直接使用 NumPy 数据或者使用 DataLoader 及其相关算子. 在大型工业场景下,数据加载容易成 ...
- fiddler选项卡-Filters(过滤)
Filter filter的意思是过滤,在fiddler中,它可以用来过滤请求,使得session列表能够更加精准的展现抓到的数据流,而不是杂乱的一堆. 1.filter的界面 2.界面详解 1.Us ...
- vulhub-struts2-s2-007
0x00 漏洞原理 当配置了验证规则 <ActionName>-validation.xml 时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL ...
- 端午总结Vue3中computed和watch的使用
1使用计算属性 computed 实现按钮是否禁用 我们在有些业务场景的时候,需要将按钮禁用. 这个时候,我们需要使用(disabled)属性来实现. disabled的值是true表示禁用.fals ...
- powerDisigner使用
最近要忙期考,但还是决定每天抽点空来写CodeSmith的系列文章了,在此实在不敢用教程这个词语,毕竟自己对CodeSmith了解的也不是很多,有很多牛人都在博客园发布了不少关于CodeSmith ...
- 【NX二次开发】获取指定矩阵标识的矩阵值
函数:UF_CSYS_ask_matrix_values () 函数说明:获取指定矩阵标识的矩阵值. 用法: #include <uf.h> #include <uf_csys.h& ...
- Eclipse安装Pydev插件时所遇到的问题
安装pydev插件折腾了半天,因为总是安装不成功,不成功的表现就是:windows-preferences设置里没有pydev 由于第一次安装这个插件所以不了解安装pydev插件的版本是有要求的,根据 ...
- Flink从Kafka取数WordCount后TableApi写入ES
一.背景说明 需求为从Kafka消费对应主题数据,通过TableApi对数据进行WordCount后,基于DDL写法将数据写入ES. 二.代码部分 说明:代码中关于Kafka及ES的连接部分可以抽象到 ...