若操作页面中出现长时间查询或其他耗时操作,页面会出现卡死状态,为了更好的用户体验我们可以创建线程来操作这些耗时操作。一般的线程task,如果想看到线程执行状态可以使用backgroundwoker来操作。
实现BackgroungWoker有三个事件DoWork,ProgressChanged,RunWokerCompleted 注:在Dowork中不能操作页面控件,要将对控件的操作放在RunWokerCompleted工作完成以后。
DoWork:在调用RunWokerAsyns事件的时候发生,异步完成要操作的事件。
ProgressChanged:在DoWork中会被自动调用,以通知线程执行状态告知用户。包含一个int类型的ProgressPercentage告知完成进度百分比。
RunWokerCompleted:在Dowork完成或取消以后自动调用。该事件的RunWorkerCompletedEventArgs参数包含三个常用的属性Error,Cancelled,Result。其中,Error表示在执行异步操作期间发生的错误;Cancelled用于判断用户是否取消了异步操作;Result属性接收来自DoWork事件的DoWorkEventArgs参数的Result属性值,可用于传递异步操作的执行结果。
BackgroundWorker bgw = new BackgroundWorker();//创建实例
private void BeginWork(){
bgw.DoWork += bgw_DoWork;//创建Dowork事件
bgw.ProgressChanged += bgw_ProgressChanged;//注册ProgressChanged事件做显示进度条
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;//注册RunWorkerCompleted事件完成或取消后的操作
bgw.WorkerSupportsCancellation = true;//允许取消任务
bgw.WorkerReportsProgress = true;//开启进度条
if (!bgw.IsBusy)//判断backgroundWorker是否正在运行异步操作
{
bgw.RunWorkerAsync();//开始执行后台操作,调用DoWork事件
}progressBar1.Value = 0;//progressBar1进度条控件
progressBar1.Visible = true;}
private void bgw_DoWork(object sender, DoWorkEventArgs e)//DoWork事件
{
bgw.ReportProgress(1);//进度1
if (bgw.CancellationPending)//访问CancellationPending获知用户是否取消任务 { bgw.ReportProgress(2);//进度2 e.Cancel = true; bgw.ReportProgress(3);//进度3 return; }else{ //操作 bgw.ReportProgress(2);//进度2 //操作 bgw.ReportProgress(3);//进度3 }}
private void bgw_ProgressChanged(object sender,ProgressChangedEventArgs e)//将进度传递给peogress控件显示在页面中提高用户体验
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)//Dowork完成或取消以后执行
{if(e.Error!=null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled){//完成操作
}
else{MessageBox.Show("用户操作已经取消");
}
}