C#多线程BackgroundWorker
用C#开发应用程序,常会遇到读写大量文件的情况,比如批量操作Excel。为保证主界面的响应,需要开启新线程,在线程中进行耗时操作。不过.net为我们封装好了一个多线程控件BackgroundWorker,调用该类可以轻松完成耗时操作,并在主界面中以进度条等方面显示处理进度。
根据MSDN的说明,使用BackgroundWorker需要注册以下几个事件
然后调用RunWorkerAsync()方法开始执行后台操作。
public partial class FormReview : Form
{
public FormReview()
{
InitializeComponent();
}
//实例化一个BackgroundWorker
BackgroundWorker bgw = new BackgroundWorker();
ToolStripProgressBar progressBar = new ToolStripProgressBar();
Report report = new Report();
private void FormReview_Load(object sender, EventArgs e)
{
bgw.DoWork += new DoWorkEventHandler(ReportDoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ReportCompleted);
//反馈进度
bgw.WorkerReportsProgress = true;
progressBar.Maximum = 100;
progressBar.Visible = false
statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.progressBar});
report.Bgw = bgw;
progressBar.Visible = true;
bgw.RunWorkerAsync();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ReportDoWork(object sender, DoWorkEventArgs e)
{
report.WriteReport();
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//progressBar的最大值设置为100,进度以百分比显示
progressBar.Value = e.ProgressPercentage;
}
private void ReportCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
bgw.ProgressChanged -= bgw_ProgressChanged);
bgw.DoWork -= ReportDoWork;
bgw.RunWorkerCompleted -= ReportCompleted;
}
}
定义Report类,文件耗时操作放在这里
public class Report
{
BackgroundWorker bgw = new BackgroundWorker();
public BackgroundWorker Bgw
{
get { return bgw; }
set { bgw = value; }
}
/// <summary>
///
/// </summary>
public void WriteReport()
{
//批量操作,比如有200个文件
for (int i = 0,len = 200; i < len; i++)
{
//耗时操作放在这里,具体内容省了
//......
//向主线程报告处理进度,百分比
bgw.ReportProgress((i + 1) * 100/len);
}
}
}