第一步:先建立一個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條資料,耗時如圖所示

沒用啟用執行緒執行,耗時: