BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)
在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,
则可以使用BackgroundWorker类方便地解决问题。
在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,
则可以使用BackgroundWorker类方便地解决问题。
BackgroundWorker支持后台与UI线程的交互。使用ProgressChanged配合worker.ReportProgress(100)汇报进度;
using (BackgroundWorker bw = new BackgroundWorker())
{
bw.ProgressChanged += new ProgressChangedEventHandler(Bw_ProgressChanged);//创建变更事件
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Bw_RunWorkerCompleted);//创建完成事件
bw.WorkerReportsProgress = true;//打开进度报告更新
bw.DoWork += new DoWorkEventHandler(bw_DoWork);//委托事件
bw.RunWorkerAsync(fileinfo1.FullName);//开始执行
}
在后台中添加ReportProgress()来激活Bw_ProgressChanged()与UI线程做交互。
public async void EditXlsx(DataSet data, BackgroundWorker worker)
{
worker.ReportProgress((i * 100 / data.Tables[0].Rows.Count));
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
EditXlsx(ToDataTable(e.Argument.ToString()), (BackgroundWorker)sender);
}
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//System.Diagnostics.Process.Start("explorer.exe", FileName + "Result" + "\\");
this.probar.Value = 100;
MessageBox.Show("转制完成");
}
private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
probar.Value = e.ProgressPercentage;
}