首先在窗体拖入一个BackgroundWorker组件,根据功能需要设置BackgroundWorker的属性
WorkerSupportsCancellation = true; 允许取消后台正在执行的操作
WorkerReportsProgress = true; 允许显示后台操作的执行进度(主要作用是与主窗体交互,解决了“不允许跨线程访问控件”之类的错误)
1、开始执行后台操作
在执行后台操作的地方调用BackgroundWorker组件的RunWorkerAsync()方法,该方法执行时会触发BackgroundWorker组件的DoWork 事件。所以接下来添加BackgroundWorker组件的DoWork 事件,在事件中写要实现的后台操作代码即可。比如
private void button1_Click(object sender, EventArgs e) { bgWork.RunWorkerAsync(); //调用方法,触发DoWork事件 } private void bgWork_DoWork(object sender, DoWorkEventArgs e) { //在此实现后台操作代码 }
2、取消正在执行的后台操作
在取消后台操作的地方调用BackgroundWorker组件的CancelAsync()方法,然后在DoWork事件判断BackgroundWorker组件的后台操作状态,即BackgroundWorker组件的CancellationPending属性。
private void btnCancel_Click(object sender, EventArgs e) { bgWork.CancelAsync(); } private void bgWork_DoWork(object sender, DoWorkEventArgs e) { if (bgWork.CancellationPending) { Thread.Sleep(); //这里实现回滚操作 e.Cancel = true; } else { Thread.Sleep(); //这里实现后台操作 } }
3、主窗体界面显示后台操作状态或进度
在DoWork事件的后台操作代码最后调用BackgroundWorker组件的ReportProgress()方法。该方法被执行是会触发BackgroundWorker组件的ProgressChanged事件,在该事件中可以操作主窗体控件。
private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e) { label1.Text = e.UserState; //第一个参数 progressBar1.Value = e.ProgressPercentage; //第二个参数 } private void bgWork_DoWork(object sender, DoWorkEventArgs e) { ; i < ; i++) { if (bgWork.CancellationPending) { ; k--) { Thread.Sleep(); //这里实现回滚操作 bgWork.ReportProgress(k, "正在收回数据"); } e.Cancel = true; return; } else { Thread.Sleep(); //这里执行后台操作 bgWork.ReportProgress(i, "正在录入数据"); } } }
4、后台操作结束后提示信息。
当后台操作结束后,会触发BackgroundWorker组件的RunWorkerCompleted事件
private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { MessageBox.Show("当前操作被取消!"); } else { MessageBox.Show("操作完成!"); } }
参考:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html
参考:http://www.cnblogs.com/chenxizhang/archive/2010/03/13/1685209.html