好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

多线程学习之限制同时运行的线程数量

多线程学习之限制同时运行的线程数量

多线程学习之限制同时运行的线程数量

最近闲暇之余,来搞搞,多线程学习,只为下个项目做准备,随着项目优化,开发,性能的考虑,慢慢要用到些以前不用的东西,先开始熟悉熟悉

先把东西放上来,欢迎大家赐教,比较好久木玩这东西了,肯定不完善,希望大家提出宝贵意见啊(嘿嘿~~)

大概功能描述:为了提高数据处理速度,把任务队列分别交给不同子线程去完成,同时对启动的新线程数量限制,避免线程数量过多照成机器卡壳

  1   using   System;
   2   using   System.Threading;
   3   namespace   ThreadTest
   4   {
   5     class   ThreadMaxNum
   6       {
   7           static   int  NowThCount =  0 ; //  当前已启动线程数量 
  8           static   int  MaxThCount =  5 ; //  允许最大启动线程数量 
  9           static   int  RunNum =  15 ; //  当前有多少个要处理的程序[任务队列] 
 10           public   static   void   Run()
  11           {
  12               Thread NewTh;
  13               while  ( true  )
  14               {
  15                   //  当前没有活动线程,且 任务队列 为空 说明任务完成了 
 16                   if  (NowThCount ==  0  && RunNum ==  0  )
  17                       break  ;
  18                  
 19                   //  任务队列为空 ,但是又线程运行中,就让主线程休息 下,在判断 
 20                   if  (RunNum ==  0  && NowThCount !=  0  ) 
  21                   {
  22                      Thread.Sleep( 2000 ); //  休息 
 23                       continue ; //  再次判断 
 24                   }
  25  
 26                   //  如果 当前活动线程数量 达到最大线程 就不在 开始新的任务 
 27                   if  (NowThCount >=  MaxThCount)
  28                   {
  29                      Thread.Sleep( 2000 ); //  休息 
 30                       continue ; //  再次判断 
 31                   }
  32  
 33                   //  有 队列>0,且没有达到最大 
 34                   if  (RunNum >  0  && NowThCount <  MaxThCount)
  35                   {
  36                       //  一个任务已经去执行了,应该减掉个,执行结果如何,这里不判断 
 37                      RunNum-- ;
  38  
 39                      NewTh =  new  Thread( new   ThreadStart(RunNewFun));
  40                       NewTh.Start();
  41                   }
  42               }
  43              Console.WriteLine( "  任务队列,执行完成:  " + RunNum);
  44           }
  45           static   void   RunNewFun()
  46           {
  47              NowThCount++; //  加个 
 48  
 49              Console.WriteLine( "  我是线程:  "  +  Thread.CurrentThread.ManagedThreadId);
  50              Thread.Sleep( 3000  );
  51              Console.WriteLine( "  我是线程:  "  + Thread.CurrentThread.ManagedThreadId +  "  .....结束  "  );
  52  
 53              NowThCount--; //  减去 
 54           }
  55       }
  56  }

NPOI导出Excel和基于office导出Excel表比较

首先介绍一下NPOI吧。

NPOI 是  POI  项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。

使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。 NPOI 是构建在 POI 3.x 版本之上的,它可以在没有安装 Office 的情况下对 Word/Excel 文档进行读写操作。

 

NPOI的优势:

(一)传统操作 Excel 遇到的问题:

1、如果是 .NET ,需要在服务器端装 Office ,且及时更新它,以防漏洞,还需要设定权限允许 .NET 访问 COM+ ,如果在导出过程中出问题可能导致服务器宕机。

2、 Excel 会把只包含数字的列进行类型转换,本来是文本型的, Excel 会将其转成数值型的,比如编号000123会变成123。

3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。

4、 Excel 会根据 Excel 文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702 E +17格式,日期列变成包含日期和数字的。

(二)使用 NPOI 的优势

1、你不需要在服务器上安装微软的 Office ,可以避免版权问题。

2、使用起来比 Office PIA 的 API 更加方便,更人性化。

3、你不用去花大力气维护 NPOI , NPOI  Team 会不断更新、改善 NPOI ,绝对省成本。

 

基于office导出到Excel实现:

?

public   static   void   ExportExcel( string   fileName, DataGridView myDGV, bool   isShowDialog)

       {

           string   saveFileName = "" ;

           if   (isShowDialog)

           {

               //bool fileSaved = false;

               SaveFileDialog saveDialog = new   SaveFileDialog();

               saveDialog.DefaultExt = "xls" ;

               saveDialog.Filter = "Excel文件|*.xls" ;

               saveDialog.FileName = fileName;

               saveDialog.ShowDialog();

               saveFileName = saveDialog.FileName;

               if   (saveFileName.IndexOf( ":" ) < 0) return ; //被点了取消

           }

           else

           {

              // saveFileName = Application.StartupPath + @"\导出记录\" + fileName + ".xls";

               saveFileName = fileName;

           }

           Microsoft.Office.Interop.Excel.Application xlApp = new   Microsoft.Office.Interop.Excel.Application();

           if   (xlApp == null )

           {

               MessageBox.Show( "无法创建Excel对象,可能您的机子未安装Excel" );

               return ;

           }

 

           Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;

           Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);

           Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; //取得sheet1

 

           //写入标题

           for   ( int   i = 0; i < myDGV.ColumnCount; i++)

           {

               worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;

           }

           //写入数值

           for   ( int   r = 0; r < myDGV.Rows.Count; r++)

           {

               for   ( int   i = 0; i < myDGV.ColumnCount; i++)

               {

                   if   (myDGV[i, r].ValueType == typeof ( string )

                      || myDGV[i, r].ValueType == typeof (DateTime)) //这里就是验证DataGridView单元格中的类型,如果是string或是DataTime类型,则在放入缓 存时在该内容前加入" ";

                   {

                       worksheet.Cells[r + 2, i + 1] = "'"   + myDGV.Rows[r].Cells[i].Value;

                   }

                   else

                   {

                       worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;

                   }

               }

               System.Windows.Forms.Application.DoEvents();

           }

           worksheet.Columns.EntireColumn.AutoFit(); //列宽自适应

           //if (Microsoft.Office.Interop.cmbxType.Text != "Notification")

           //{

           //    Excel.Range rg = worksheet.get_Range(worksheet.Cells[2, 2], worksheet.Cells[ds.Tables[0].Rows.Count + 1, 2]);

           //    rg.NumberFormat = "00000000";

           //}

 

           if   (saveFileName != "" )

           {

               try

               {

                   workbook.Saved = true ;

                   workbook.SaveCopyAs(saveFileName);

                   //fileSaved = true;

               }

               catch   (Exception ex)

               {

                   //fileSaved = false;

                   MessageBox.Show( "导出文件时出错,文件可能正被打开!\n"   + ex.Message);

               }

 

           }

           //else

           //{

           //    fileSaved = false;

           //}

           xlApp.Quit();

           GC.Collect(); //强行销毁

           // if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打开EXCEL

           MessageBox.Show(fileName + "保存成功" , "提示" , MessageBoxButtons.OK);

       }

 NPOI导出到Excel表实现:

?

/// <summary>

         /// NPOI导出Excel,不依赖本地是否装有Excel,导出速度快

         /// </summary>

         /// <param name="dataGridView1">要导出的dataGridView控件</param>

         /// <param name="sheetName">sheet表名</param>

         public   static   void   ExportToExcel(DataGridView dataGridView1, string   sheetName)

         {

             SaveFileDialog fileDialog = new   SaveFileDialog();

             fileDialog.Filter = "Excel|*.xls" ;

             if   (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)

             {

                 return ;

             }

             //不允许dataGridView显示添加行,负责导出时会报最后一行未实例化错误

             dataGridView1.AllowUserToAddRows = false ;

             HSSFWorkbook workbook = new   HSSFWorkbook();

             ISheet sheet = workbook.CreateSheet(sheetName);

             IRow rowHead = sheet.CreateRow(0);

 

             //填写表头

             for   ( int   i = 0; i < dataGridView1.Columns.Count; i++)

             {

                 rowHead.CreateCell(i, CellType.STRING).SetCellValue(dataGridView1.Columns[i].HeaderText.ToString());

             }

             //填写内容

             for   ( int   i = 0; i < dataGridView1.Rows.Count; i++)

             {

                 IRow row = sheet.CreateRow(i + 1);

                 for   ( int   j = 0; j < dataGridView1.Columns.Count; j++)

                 {

                     row.CreateCell(j, CellType.STRING).SetCellValue(dataGridView1.Rows[i].Cells[j].Value.ToString());

                 }

             }         

 

             using   (FileStream stream = File.OpenWrite(fileDialog.FileName))

             {

                 workbook.Write(stream);

                 stream.Close();

             }

             MessageBox.Show( "导出数据成功!" , "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information);

             GC.Collect();

         }

  经过比较:如果导出50000条int类型的数据,基于office导出需要10分钟左右的时间,NPOI导出则需要3秒钟左右的时间。

  NPOI导出时间截图如下:

基于office导出时间截图如下:

呵呵,看出来两者的速度了吧,并且NPOI用起来相当的灵活,第一次写博客,希望和大家共同分享,共同学习,共同进步!

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于多线程学习之限制同时运行的线程数量的详细内容...

  阅读:34次