C# 线程池使用

时间:2022-11-13 17:36:46

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

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

不用线程读取时间:

C# 线程池使用

 

使用线程读取时间:

C# 线程池使用

 

主要代码:

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