查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据我的理解翻译):BackgroundWorker类容许您在单独的线程上执行某个可能致使用户界面(UI)中止响应的耗时操做(好比文件下载数据库事务等),而且想要一个响应式的UI来反应当前耗时操做的进度。
能够看的出来,BackgroundWorker组件提供了一种执行异步操做(后台线程)的同时,而且还能妥妥的显示操做进度的解决方案。因而乎,我便深刻的了解了一下BackgroundWorker类。针对BackgroundWorker类的部分重要属性和方法进行了一次总结。 数据库
private BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true;
bgWorker.WorkerSupportsCancellation = true;
//在DoWork中键入以下代码 for (int i = 0; i <= 100; i++) { if (bgWorker.CancellationPending) { e.Cancel = true; return; } else { bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); } }
//防止重复执行异步操做引起错误 if (bgWorker.IsBusy) return; bgWorker.RunWorkerAsync();
//在启动异步操做的地方键入代码 bgWorker.RunWorkerAsync("hello");
for (int i = 0; i <= 100; i++) { //向ProgressChanged报告进度 bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); }
//在须要执行取消操做的地方键入如下代码 bgWorker.CancelAsync();
DoWork
用于承载异步操做。当调用BackgroundWorker.RunWorkerAsync()时触发。
须要注意的是,因为DoWork事件内部的代码运行在非UI线程之上,因此在DoWork事件内部应避免于用户界面交互,而于用户界面交互的操做应放置在ProgressChanged和RunWorkerCompleted事件中。异步
ProgressChanged
当调用BackgroundWorker.ReportProgress(int percentProgress)方式时触发该事件。
该事件的ProgressChangedEventArgs.ProgressPercentage属性能够接收来自ReportProgress方法传递的percentProgress参数值,ProgressChangedEventArgs.UserState属性能够接收来自ReportProgress方法传递的userState参数。this
RunWorkerCompleted
异步操做完成或取消时执行的操做,当调用DoWork事件执行完成时触发。
该事件的RunWorkerCompletedEventArgs参数包含三个经常使用的属性Error,Cancelled,Result。其中,Error表示在执行异步操做期间发生的错误;Cancelled用于判断用户是否取消了异步操做;Result属性接收来自DoWork事件的DoWorkEventArgs参数的Result属性值,可用于传递异步操做的执行结果。spa
前台线程
后台翻译
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace PrograssBar { public partial class PrograssBarUseBackgroundWorker : Form { private BackgroundWorker bgWorker = new BackgroundWorker(); public PrograssBarUseBackgroundWorker() { InitializeComponent(); InitializeBackgroundWorker(); } private void InitializeBackgroundWorker() { bgWorker.WorkerReportsProgress = true; bgWorker.WorkerSupportsCancellation = true; bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged); bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted); } private void btnStart_Click(object sender, EventArgs e) { if (bgWorker.IsBusy) return; this.progressBar1.Maximum = 100; this.btnStart.Enabled = false; this.btnStop.Enabled = true; bgWorker.RunWorkerAsync("hello"); } public void bgWorker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i <= 100; i++) { if (bgWorker.CancellationPending) { e.Cancel = true; return; } else { bgWorker.ReportProgress(i,"Working"); System.Threading.Thread.Sleep(10); } } } public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e) { //string state = (string)e.UserState;//接收ReportProgress方法传递过来的userState this.progressBar1.Value = e.ProgressPercentage; this.label1.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage) + "%"; } public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if(e.Error!=null) { MessageBox.Show(e.Error.ToString()); return; } if (!e.Cancelled) this.label1.Text = "处理完毕!"; else this.label1.Text = "处理终止!"; } private void btnStop_Click(object sender, EventArgs e) { this.btnStart.Enabled = true; this.btnStop.Enabled = false; bgWorker.CancelAsync(); } } }
运行结果:code