使用.netCore3.1多线程读取数据库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使⽤.netCore3.1多线程读取数据库
第⼀步:先创建⼀个DBhepler类,作为连接数据库中⼼,这个不过多说明,单纯作为数据库的连接...........
1public static string Constr = "数据库连接字符串";
2public static DataTable Select(string sql, SqlParameter[] sp)
3 {
4using (SqlConnection conn = new SqlConnection(Constr))
5 {
6 conn.Open();
7 DataTable dt = new DataTable();
8 SqlCommand cmd = new SqlCommand(sql, conn);
9if (sp != null)
10 {
11 mandType = CommandType.StoredProcedure;
12 cmd.Parameters.AddRange(sp);
13
14 }
15
16 SqlDataAdapter sdr = new SqlDataAdapter(cmd);
17 sdr.Fill(dt);
18 conn.Close();
19return dt;
20 }
21
22 }
第⼆步:将读取的DataTable,数据信息转换为List
1public static IList<T> TableToListModel<T>(DataTable dt)
2where T : new()
3 {
4
5
6 IList<T> ts = new List<T>();// 定义集合
7
8foreach (DataRow dr in dt.Rows)
9 {
10
11lock (obj_Lock)//就给锁住,注意这⾥是要加锁的,虽然我执⾏的时候没加锁,也成功了,但还是要加上............具体原因,你猜....
12 {
16 T t = new T();
17 PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
18foreach (PropertyInfo pi in propertys)
19 {
20//获取属性名称
21 String name = ;
22if (dr.Table.Columns.Contains(name))
23 {
24//⾮泛型
25if (!pi.PropertyType.IsGenericType)
26 {
27 pi.SetValue(t, string.IsNullOrEmpty(dr[name].ToString()) ? null : Convert.ChangeType(dr[name], pi.PropertyType), null);
28 }
29//泛型Nullable<>
30else
31 {
32 Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
33//model属性是可为null类型,进⾏赋null值
34if (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 }
46return 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();
3string sql1 = " 查询的SQL1";
4string sql2 = "";
5string sql3 = "";
6string 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条数据,耗时如图所⽰
没⽤启⽤线程执⾏,耗时: