第一步:先創建一個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條數據,耗時如圖所示
沒用啟用線程執行,耗時: