使用.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條數據,耗時如圖所示

沒用啟用線程執行,耗時:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM