• PAIP.提升性能---LISTBOX加载30万大数据量终结方案


    PAIP.提升性能---LISTBOX加载30万大数据量终结方案 


    作者Attilax ,  EMAIL:1466519819@qq.com 


    经过一番奋斗,终于LISTBOX加载30万大数据量有了好的性能方案……




    结果如下:
    1K,0.6S
    1W,5S
    10W,48S
    这样推算30万数据应该在150秒左右加载完毕,以后台线程的方式加载,前台界面UI不卡…………达到了很高的效率了,




    提升性能最关键的地方在于  Thread.Sleep(10);  
    -------------------------  


       while (line != null)
                       {
     
                           n++;
                        
                          
                           if (n % 1000 == 0)
                           {
                               Console.WriteLine("--" + n.ToString() + ":" + line);
                               Thread.Sleep(10);
                            
                           }




     Thread.Sleep得太频繁,则界面UI更流畅,但是后台线程效率就不高了,反之则反之……
    于是采用n % 1000  ,让后台线程加载一千数据后切换到UI线程。这样就数据线程加载效率与UI线程流畅度兼顾……达到了很好的效果……




    如果全部加载完10W数据再SLEEP,则10W,40S,但是界面UI就卡住了……


    如果每加载一条 数据就SLEEP(1),效率就低了5K,10…………




    ------------源码如下:----------




            int loadRecNum = 0;
            long curtime = 0;
         //   long sleepSpan
            private void button1_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDlg = new OpenFileDialog();
                openFileDlg.Title = "请选择:";
                openFileDlg.Filter = "*.*|*.*";
                openFileDlg.ShowDialog();
                if (openFileDlg.CheckFileExists)
                {
                    if (openFileDlg.FileName.Equals(""))
                        return;
                    String pathYZM = openFileDlg.FileName;




                    //c452308 add txt2list
                    Thread t = new Thread(new ParameterizedThreadStart(
                   delegate(object obj)
                   {
                       lastUpdateSec = 0;
                       loadRecNum = 0;
                       curtime = DateTime.Now.Ticks;


                       //c45  big txt


                       //Pass the file path and file name to the StreamReader constructor
                       StreamReader sr = new StreamReader(pathYZM);


                       //Read the first line of text
                       string line = sr.ReadLine();


                       //Continue to read until you reach end of file
                       int n = 0;
                       //  listBox1.Visible = false;
     
                       
                       Form1 fm = (Form1)obj;
                       while (line != null)
                       {
                          
                         //  Thread.Sleep(1);
                      //     Console.WriteLine("--" + n.ToString() + ":" + line);
                           n++;
                        
                           //write the lie to console window
                           if (n % 1000 == 0)
                           {
                               Console.WriteLine("--" + n.ToString() + ":" + line);
                               Thread.Sleep(10);
                            
                           }


                           add2List(line);
                           updateConter4listbox();


                           int readNum = this.settingForm.getReadNum();
                           if (n >= readNum)
                               break;
                           //Read the next line
                           line = sr.ReadLine();
                          


                       }
                       updateConter4listboxLimidtl();
                       //close the file
                       sr.Close();


                      // ListboxEndUpdate();
                       c45




                    
                       
                   }


                   ));
                    t.Name = " --start txt2list thread";
                    t.IsBackground = true;
                    t.Start(this);




                   


     
                }






            }


            int lastUpdateSec = 0;
            /// <summary>
            /// update per secs
            /// </summary>
            private void updateConter4listbox()
            {
               // loadRecNum++;
              


                long nowtime = DateTime.Now.Ticks;
                float span = (float)(((float)(nowtime - curtime)) / ((float)10000000));
                int spanint = (int)span;
                if (spanint <= lastUpdateSec)
                    return;
                else
                    lastUpdateSec = spanint;




                label9.Invoke(new EventHandler(delegate
                {
                    label9.Text = "用  时:" + span.ToString() + "秒";


                }));




                label8.Invoke(new EventHandler(delegate
                {
                    label8.Text = "已经加载:" + loadRecNum.ToString();


                }));
            }


            private void updateConter4listboxLimidtl()
            {
                // loadRecNum++;




                long nowtime = DateTime.Now.Ticks;
                float span = (float)(((float)(nowtime - curtime)) / ((float)10000000));
                int spanint = (int)span;
              




                label9.Invoke(new EventHandler(delegate
                {
                    label9.Text = "用  时:" + span.ToString() + "秒";


                }));




                label8.Invoke(new EventHandler(delegate
                {
                    label8.Text = "已经加载:" + loadRecNum.ToString();


                }));
            }


            private void ListboxEndUpdate()
            {
                listBox1.Invoke(new EventHandler(delegate
                {
                    listBox1.EndUpdate();


                }));
            }
            int nc45 = 0;
            public void add2List(string line)
            {
             
                accFilter4ihush af = new accFilter4ihush();


                if (af.filterOK(line))
                {
                    loadRecNum++;
                    //BeginInvoke
                    listBox1.Invoke(new EventHandler(delegate
                            {
                                
                               // Thread.Sleep(5000);
                                this.listBox1.Items.Add(line);
                              //  Console.WriteLine("--add2List:" + nc45.ToString() + ":" + line);
                                nc45++;
                            }));
                } 
               
            }


            

  • 相关阅读:
    GoF23种设计模式之行为型模式之中介者模式
    GoF23种设计模式之行为型模式之备忘录模式
    GoF23种设计模式之行为型模式之解释器模式
    GoF23种设计模式之行为型模式之观察者模式
    GoF23种设计模式之行为型模式之状态模式
    GoF23种设计模式之行为型模式之策略模式
    GoF23种设计模式之行为型模式之模板方法
    GoF23种设计模式之行为型模式之访问者模式
    电子地图/卫星地图下载并转存为jpg图片
    webapi swagger学习笔记
  • 原文地址:https://www.cnblogs.com/attilax/p/15199690.html
Copyright © 2020-2023  润新知