WinForm使用多线程异步加载界面数据
处于学习阶段,做个记录,如有写错,请多多指教。
private void FrmQC111_Load(object sender, EventArgs e)
{
Thread load = new Thread((obj) =>
{
//创建一个新线程,并编写执行的方法
Action<string> act = new Action<string>(Bindt);
act.BeginInvoke(null, null, null);
});
load.IsBackground = true;
load.Start();
}
private void Bindt(string a)
{
//实现具体绑定方法
}
1. 需求
页面初始化时,需要给大量下拉控件绑定下拉列表,数据源需要从数据库查询出来,如果使用默认的顺序加载方式,页面会在所有控件数据加载完成后才能初始化完成,页面会卡顿比较久的时间,为了页面加载及空间数据源加载互不影响,考虑使用异步加载的方式,将加载控件数据部分独立出一个新线程操作,与原线程互不影响,实现在显示页面的同时,异步加载控件数据。
1. 知识
多线程(主线程=前台线程、子线程=后台线程)
内置委托(Action)
Invoke以及BeginInvoke
1. 实现
此处不使用Lamba表达式,上面代码段是用Lamda表达式实现
通过Thread类创建子线程
private void FrmQC111_Load(object sender, EventArgs e)
{
Thread load = new Thread(new ThreadStart(loadpage));
//ThreadStart 是一个委托,ThreadStart 委托只能用于无返回值、无参数的方法,ParameterizedThreadStart 委托则可以用于带参数的方法
//Loadpage 是该线程将要执行的方法。
//Load是新线程对象。
}
通过内置委托的BeginInvoke绑定具体方法
Private void loadpage()
{
Action act = new Action(Bindt); //创建委托对象,与指定方法Bindt进行关联
act.BeginInvoke(null, null, null);
//第一个null,为action传入参数
//第二个null为异步回调函数
//第三个null为回调函数返回结果
}
实现加载控件数据源的方法
private void Bindt(String a)
{
//……….
}
参考:https://blog.csdn.net/qq_33574890/article/details/83386757
https://www.cnblogs.com/wyt007/p/9486752.html
https://www.cnblogs.com/Xue-Dragon/p/10578190.html
https://www.cnblogs.com/whl4835349/p/11757688.html
https://www.cnblogs.com/xingyuanzier/p/11144322.html
测试
因为数据加载过快,看不到异步执行结果,因此在绑定数据的方法中让线程等待10s以观察实际效果
Thread.Sleep(10000);
结果
页面会先打开,打开之后大概8s左右,控件数据自动加载成功。
参考文章:
https://blog.csdn.net/qq_33574890/article/details/83386757
https://www.cnblogs.com/wyt007/p/9486752.html
https://www.cnblogs.com/Xue-Dragon/p/10578190.html
https://www.cnblogs.com/whl4835349/p/11757688.html
https://www.cnblogs.com/xingyuanzier/p/11144322.html