使用.netCore3.1多线程读取数据库

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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条数据,耗时如图所⽰

没⽤启⽤线程执⾏,耗时:

相关文档
最新文档