C# 線程池使用

來源:互聯網
上載者:User

標籤:ble   sqlcmd   ade   []   最大的   ati   bsp   form   raw   

使用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());        }

 

C# 線程池使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.