• 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());
            }
  • 相关阅读:
    SpringMVC中web.xml中url配置路径 / 和 /* 的区别
    spring mvc @RequestMapping method 不写的话,默认GET、POST都支持,根据前端方式自动适应
    MyBatis项目所引用的一切依赖jar包和自定义设置
    Python 代码性能优化技巧
    linux basic commands
    linuxx virutal machine installation
    安装 Django
    virtualenv (isolated virtual environment) for python runtime
    夜间模式的开启与关闭,父模板的制作
    完成登录与注册页面的前端
  • 原文地址:https://www.cnblogs.com/guojingmail2009/p/7372686.html
Copyright © 2020-2023  润新知