本文共 3372 字,大约阅读时间需要 11 分钟。
从上图可见在整个生活周期内发生了3次重要的参数传递过程:
参数传递1:此次的参数传递是将RunWorkerAsync(Object)中的Object传递到DoWork事件的DoWorkEventArgs.Argument,由于在这里只有一个参数可以传递,所以在实际应用往封装一个类,将整个实例化的类作为RunWorkerAsync的Object传递到DoWorkEventArgs.Argument; 参数传递2:此次是将程序运行进度传递给ProgressChanged事件,实际使用中往往使用给方法和事件更新进度条或者日志信息; 参数传递3:在DoWork事件结束之前,将后台线程产生的结果数据赋给DoWorkEventArgs.Result一边在RunWorkerCompleted事件中调用RunWorkerCompletedEventArgs.Result属性取得后台线程产生的结果。 另外从上图可以看到DoWork事件是在后台线程中运行的,所以在该事件中不能够操作用户界面的内容,如果需要更新用户界面,可以使用ProgressChanged事件及RunWorkCompleted事件来实现。 在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace BackgroundWorkerDemo { public partial class MainForm : Form { private BackgroundWorker worker = new BackgroundWorker(); public MainForm() { InitializeComponent(); worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; //正式做事情的地方 worker.DoWork+=new DoWorkEventHandler(DoWork); //任务完称时要做的,比如提示等等 worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged); //任务进行时,报告进度 worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork); }//调用 RunWorkerAsync 时发生
public void DoWork(object sender, DoWorkEventArgs e) { e.Result = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束 } //调用 ReportProgress 时发生 public void ProgessChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; } //当后台操作已完成、被取消或引发异常时发生 public void CompleteWork(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("完成!"); }private int ComputeFibonacci(object sender, DoWorkEventArgs e)
{ for (int i = 0; i < 1000; i++) { if (worker.CancellationPending) { e.Cancel = true; } else { worker.ReportProgress(i); } System.Threading.Thread.Sleep(10); } return -1; }private void btnStart_Click(object sender, EventArgs e)
{ worker.RunWorkerAsync(); btnStart.Enabled = false; btnPause.Enabled = true; }private void btnPause_Click(object sender, EventArgs e)
{ btnPause.Enabled = false; btnStart.Enabled = true; worker.CancelAsync(); } } }
本文转自黄聪博客园博客,原文链接http://www.cnblogs.com/huangcong/archive/2010/03/26/1697051.html,如需转载请自行联系原作者