我这里只是示例,具体原理可以参考下面网页
https://blog.csdn.net/wzj0808/article/details/78844667
我使用的场景是 主业务界面打开后,有N个基础数据表要加载,问题是如果等界面全部加载完毕需要较长时间,用户体验太差;
把一些大数量的可以放在页面的LOAD事件一开始就执行,等界面展示好后,用户实际开始操作的这段时间内后台悄悄的进行。
public partial class Form1 : Form
{
//声明
private BackgroundWorker bgWorker = new BackgroundWorker();
//比如这个要加载10万个项目
private DataTable dtItem = null;
public Form1()
{
InitializeComponent();
//构造方法里设置属性
bgWorker.WorkerReportsProgress = true;//报告完成进度
bgWorker.WorkerSupportsCancellation = true;//允许用户终止后台线程
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); //声明委托
}
private void Form1_Load(object sender, EventArgs e)
{
if (!bgWorker.IsBusy)//判断backgroundWorker1是否正在运行异步操作
{
bgWorker.RunWorkerAsync(1000);//开始执行后台操作,调用DoWork事件
}
//其他业务代码按主线程走
。。。。。。。。。。。。。。。。。。
}
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//这里是业务代码
LoadItems();
}
private void LoadItems()
{
//这里可以写比如访问数据库或配置文件读取了10万条基础数据
string connstr = ConfigurationManager.ConnectionStrings["FANXXConnectionString"].ToString();
stirng strSQL= "SELECT * FROM Items ";
//实例化链接并打开
SqlConnection conn = new SqlConnection(connstr);
SqlDataAdapter da=new SqlDataAdapter(strSQL,conn);
DataSet ds=new DataSet();
da.Fill(ds);
dtItem = ds.Tables[0].Copy();
//这里比如要对查询的数据做一些列的数据处理比较耗时
................................
}