打开页面时,如果碰到初始化数据需要时间较长,会导致打开页面有明显的延迟现象,影响用户体验效果.
解决思路: 页面是由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版权协议,转载请附上原文出处链接和本声明。