C#如何使用BackgroundWork后台辅助线程控件

转载自 http://www.cnblogs.com/goldkevin/archive/2009/10/26/1589856.html

backgroundWork 有3个事件:

this.backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
this.backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
this.backgroundWorker.ProgressChanged +=new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
我们一般把要做的耗时动作放在DoWork里面,例如:
 /// <summary>
        /// 后台操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            this.backgroundWorker.ReportProgress(100"系统正在根据您的查询条件取数据");
            DoSome();//取数据源动作            
            if (this.dt.Rows.Count == 0)//数据源为空
            {
                this.backgroundWorker.CancelAsync();
            }
            this.backgroundWorker.ReportProgress(100"数据已经取得,正在进行Excel数据导入");            
            ExportExcel();//导入Excel中
            this.backgroundWorker.ReportProgress(100"Excel导入已经完成");    
        }

 在上面的Dowork事件中,用到了ReportProgress事件,要使用此事件,必须把属性:this.backgroundWorker.WorkerReportsProgress = true;

另外也把属性: this.backgroundWorker.WorkerSupportsCancellation = true; 这个属性支持辅助线程的取消。在ReportProgress中可以把程序进度反馈给UI:

        /// <summary>
        /// 当处理情况发生变化时
         /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {          
            message.label.Text = e.UserState.ToString();    //这里的message是我新做的窗体Form,用来提示相关信息   
        }

然后操作完成:

/// <summary>         

/// 操作完成          

/// </summary>         

/// <param name="sender"></param>        

 /// <param name="e"></param>         

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)         

{      if (e.Cancelled)            

       {   MessageBox.Show("查询条件有误,请重新选择条件!");               

           return;          

       }             

       else          

       {

          message.Hide();          

       }         

}

原文地址:https://www.cnblogs.com/TJessica/p/6673819.html