利用线程解决页面打开加载数据延迟的问题

打开页面时,如果碰到初始化数据需要时间较长,会导致打开页面有明显的延迟现象,影响用户体验效果.

解决思路: 页面是由UI主线程处理,那么我们可以用 子线程去初始化数据(例如获取后台数据库数据等),等待数据获取完毕后,再并入主线程显示.
例子:
比较两种方法耗时

  static System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); //为测试使用, 得出耗时的时间
        private void Job_Summary_Load(object sender, EventArgs e)
        {
           InitControl(); //耗时较长的初始化函数
        }

        private void InitControl()
        {
            st.Start();
             //方法1: 去后台获取数据  ,一般写法
            GetAutoCmp();   
               //方法2:去后台获取数据  ,改进写法
            //GetAutoCmp_Revise(); 
            //以下可能还有其它界面控件的初始化,略
            .....
            st.Stop();
            Console.WriteLine($"Time span:{st.ElapsedMilliseconds }"); //耗时
            st.Reset();
        }
            
       
        //利用Task 改善
  private void GetAutoCmp_Revise()
        {
            Task.Run(() =>
            {
                using (ADMEntities admEnti = new ADMEntities())
                {
                    var client = admEnti.Job_Reg_Master.Where(o => o.Client != null).Select(o => o.Client);
                    var quotationno = admEnti.Job_Reg_Master.Where(o => o.QuotNo != null).Select(o => o.QuotNo);
                    var jobno = admEnti.Job_Reg_Master.Where(o => o.JobNo != null).Select(o => o.JobNo);
                    var location = admEnti.Job_Reg_Master.Where(o => o.Job_Location != null).Select(o => o.Job_Location);
                    txtClient.Invoke(new Action(() =>   //Invoke并入UI主线程
                   {
                       txtClient.AutoCompleteCustomSource.AddRange(client.ToArray());                       txtQuotationNo.AutoCompleteCustomSource.AddRange(quotationno.ToArray() );
                       txtJobNo.AutoCompleteCustomSource.AddRange(jobno.ToArray());
                       txtLocation.AutoCompleteCustomSource.AddRange(location.ToArray());
                   }));
                }
            });
        }          

版权声明:本文为segclliwf原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。