后台运行之BackgroundWorker

时间:2023-03-08 15:55:47

BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

一、BackgroundWorker 相关生命周期

1.声明BackgroundWorker

2.设置相关操作事件和属性,并开始这个对象

3.执行设置事件(DoWork事件为耗时操作,耗时操作时反馈给UI界面的ProgressChanged事件(Dowork的报告方法引发),

完成DoWork时执行RunWorkerCompleted方法)

4.写相关事件

比如导出excel

1.点击时事件

       /// <summary>
/// 将数据库数据转换为excel操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DbToExcel(object sender, RoutedEventArgs e)
{ BackgroundWorker bw = new BackgroundWorker(); //创建一个BackgroundWorker线程
bw.WorkerReportsProgress = true; //设置BackgroundWorker可以进行报告更新
bw.DoWork += new DoWorkEventHandler(toExcel); //执行耗时操作 创建一个DoWork事件,并进行报告,指定bw_DoWork方法去做事
bw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); //通过报告(数据),进行对UI操作
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); //完成操作时响应事件
PartPosition = null;
bw.RunWorkerAsync("my url");//开始执行DoWork事件 并传递一个对象
}

2.BackgroundWorker 需要执行的事件

       void toExcel(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = (BackgroundWorker)sender;
string url = e.Argument.ToString(); DataTable tableData = ProductMananger.getAllPositionList(); #region 插入数据 foreach (DataRow row in tableData.Rows)
{
//没有取消后台操作
if (!bw.CancellationPending)
{
//报告
bw.ReportProgress((int)((double)(rowIndex - ) / RowCount * ), i);
}
} }
} private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//progressBar1.Value = e.ProgressPercentage;
//label1.Text = e.UserState.ToString(); 这个是一个对象
this.progressText.Text = e.ProgressPercentage+"%";
this.progressbar_Excel.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("ok!");
}

如果不这样可以如下:

Dispatcher.Invoke(new Action(() =>
{
this.progressText.Text = (int)(Value / Maximum * ) + "%";
this.progressbar_Excel.Value = Value;
}));

参考

http://www.cnblogs.com/zhouzangood/articles/3638117.html