C# 线程池使用

使用C#线程池可以省去对线程的创建、销毁等操作,但是也不能很好的控制线程,这里是本人对线程池的理解,留下记录方便以后查询!

本DEMO用线程池多线程去读取Northwind所有表的数据与不用线程读取的时间差异

不用线程读取时间:

 

使用线程读取时间:

 

主要代码:

 1 不使用线程读取代码:

 1         private void button4_Click(object sender, EventArgs e)
 2         {
 3             if (listBox1.Items.Count > 0)
 4             {
 5                 System.Diagnostics.Stopwatch singleThreadWatch = new System.Diagnostics.Stopwatch();
 6                 singleThreadWatch.Start();
 7                 tableCount = 0;
 8                 useTime = 0;
 9                 label1.Text = "";
10                 tabControl1.Controls.Clear();
11                 string[] list = new string[listBox1.Items.Count];
12                 for (int i = 0; i < listBox1.Items.Count; i++)
13                 {
14                     list[i] = listBox1.Items[i].ToString();
15                 }
16 
17                 if (list != null && list.Length > 0)
18                 {
19                     foreach (string item in list)
20                     {
21                         tableCount += 1;
22 
23                         using (SqlConnection con = new SqlConnection(connectionString))
24                         {
25                             if (con.State != ConnectionState.Open) con.Open();
26                             string selectAllTableNameSQL = "select * from [" + item.ToString()+"]";
27                             using (SqlCommand sqlCmd = new SqlCommand(selectAllTableNameSQL, con))
28                             {
29                                 sqlCmd.CommandType = CommandType.Text;
30                                 SqlDataReader sqlDataRead = sqlCmd.ExecuteReader();
31                                 if (null != sqlDataRead)
32                                 {
33                                     DataTable dt = new DataTable();
34                                     dt.Load(sqlDataRead);
35                                     if (null != dt && dt.Rows.Count > 0)
36                                     {
37                                         DataGridView dgv = new DataGridView();
38                                         dgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
39                                         dgv.Dock = System.Windows.Forms.DockStyle.Fill;
40                                         dgv.Location = new System.Drawing.Point(3, 3);
41                                         dgv.Name = "dataGridView" + item.ToString();
42                                         dgv.RowTemplate.Height = 23;
43 
44                                         dgv.DataSource = dt;
45 
46                                         TabPage tb = new TabPage();
47                                         tb.Controls.Add(dgv);
48                                         tb.Location = new System.Drawing.Point(4, 22);
49                                         tb.Name = "tabPage" + item.ToString();
50                                         tb.Padding = new System.Windows.Forms.Padding(3);
51                                         tb.Size = new System.Drawing.Size(358, 446);
52                                         tb.Text = "tabPage" + item.ToString();
53                                         tb.UseVisualStyleBackColor = true;
54 
55                                         tabControl1.Controls.Add(tb);
56                                         Application.DoEvents();
57                                     }
58                                 }
59                                 sqlDataRead.Close();
60                                 sqlDataRead.Dispose();
61                             }
62 
63 
64                         }
65                         Application.DoEvents();
66                     }
67                 }
68 
69 
70                 singleThreadWatch.Stop();
71 
72                 TimeSpan ts = singleThreadWatch.Elapsed;
73 
74                 label1.Text = "单线程 表数量:" + list.Length.ToString() + " 总用时间: " + ts.TotalMilliseconds.ToString();
75 
76                 
77             }
78         }

 

2 使用线程池读取代码:

        private void button3_Click(object sender, EventArgs e)
        {
            if (listBox1.Items.Count > 0)
            {
                tableCount = 0;
                useTime = 0;
                label1.Text = "";
                tabControl1.Controls.Clear();
                string[] list = new string[listBox1.Items.Count];

                for (int i = 0; i < listBox1.Items.Count; i++)
                {
                    list[i] = listBox1.Items[i].ToString();
                }

                ThreadSart(list);
            }
        }

        private void ThreadSart(object t)
        {
            string[] objs = t as string[];
            if (objs != null && objs.Length > 0)
            {
                foreach (string item in objs)
                {
                    tableCount += 1;
                  
                    ThreadPool.QueueUserWorkItem(new WaitCallback(OpenAllTables), item);
                    Application.DoEvents();
                }
            }

        }

       public void OpenAllTables(object obj)
        {
            OpenDBTables(obj.ToString());
        }

        private void OpenDBTables(string b)
        {
            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
            stopWatch.Start();
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                if (con.State != ConnectionState.Open) con.Open();
                string selectAllTableNameSQL = "select * from [" + b.ToString()+"]";
                using (SqlCommand sqlCmd = new SqlCommand(selectAllTableNameSQL, con))
                {
                    sqlCmd.CommandType = CommandType.Text;
                    SqlDataReader sqlDataRead = sqlCmd.ExecuteReader();
                    if (null != sqlDataRead)
                    {
                        DataTable dt = new DataTable();
                        dt.Load(sqlDataRead);
                        if (null != dt && dt.Rows.Count > 0)
                        {
                            setData(dt,b);
                        }
                    }
                    sqlDataRead.Close();
                    sqlDataRead.Dispose();
                }


            }
            stopWatch.Stop();

            TimeSpan ts = stopWatch.Elapsed;
            Write(b.ToString() + " 打开用时:" + ts.TotalMilliseconds.ToString());

            useTime += ts.TotalMilliseconds;

            ShowCountAndTime();
            Application.DoEvents();

            //int MaxWorkerThreads, miot, AvailableWorkerThreads, aiot;

            ////获得最大的线程数量  
            //ThreadPool.GetMaxThreads(out MaxWorkerThreads, out miot);

            //AvailableWorkerThreads = aiot = 0;

            ////获得可用的线程数量  
            //ThreadPool.GetAvailableThreads(out AvailableWorkerThreads, out aiot);

            ////返回线程池中活动的线程数  
            //Write("活动的线程数:" + (MaxWorkerThreads - AvailableWorkerThreads).ToString());
        }

 

posted @ 2017-08-16 11:56  奔跑.Ken  阅读(809)  评论(0编辑  收藏  举报