BackgroundWorker用法示例
BackgroundWorker:
1.定义:是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。
2.使用场景:耗时的操作(如下载和数据库事务)长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果我们需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。
3.控件简介:有三个控件
- DoWork: 在程序中调用RunWorkerAsync会启动DoWork事件处理。
- ProgressChanged: 在事件处理过程中,调用ReportProgress方法则会启动ProgressChanged事件的事件处理。
- RunWorkerCompleted: 当DoWork事件处理完成时,则会触发RunWorkerCompleted事件。
- 注意:在DoWork事件处理程序中不操作任何用户界面对象,否则会停止响应。应该通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。
4.示例:
1 using System; 2 using System.ComponentModel; 3 using System.Threading; 4 using System.Windows.Forms; 5 6 namespace bcworker 7 { 8 public partial class Form1 : Form 9 { 10 //后台工作 11 private BackgroundWorker bw = new BackgroundWorker(); 12 13 public Form1() 14 { 15 InitializeComponent(); 16 //后台工作初始化 17 bw.WorkerReportsProgress = true;//报告进度 18 bw.WorkerSupportsCancellation = true;//支持取消 19 bw.DoWork += new DoWorkEventHandler(bgWorker_DoWork);//开始工作 20 bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//进度改变事件 21 bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);//进度完成事件 22 } 23 24 private void btnStart_Click(object sender, EventArgs e) 25 { 26 //后台工作运行中,避免重入 27 if (bw.IsBusy) return; 28 bw.RunWorkerAsync("参数");//触发DoWork事件并异步执行,IsBusy置为True 29 } 30 //后台工作将异步执行 31 public void bgWorker_DoWork(object sender, DoWorkEventArgs e) 32 { 33 //(string)e.Argument == "参数"; 34 for (int i = 0; i <= 100; i++) 35 { 36 37 if (bw.CancellationPending) 38 {//用户取消了工作 39 e.Cancel = true; 40 return; 41 } 42 else 43 { 44 bw.ReportProgress(i, "Working");//报告进度,触发ProgressChanged事件 45 Thread.Sleep(10);//模拟工作 46 } 47 } 48 } 49 //进度改变事件 50 public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e) 51 { 52 //(string)e.UserState=="Working" 53 progressBar1.Value = e.ProgressPercentage;//取得进度更新控件,不用Invoke了 54 } 55 //后台工作执行完毕,IsBusy置为False 56 public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 57 { 58 //e.Error == null 是否发生错误 59 //e.Cancelled 完成是由于取消还是正常完成 60 } 61 62 private void btnCancel_Click(object sender, EventArgs e) 63 { 64 if (bw.IsBusy) bw.CancelAsync();//设置CancellationPending属性为True 65 } 66 67 } 68 } 69 ———————————————— 70 版权声明:本文为CSDN博主「AAA张绍山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 71 原文链接:https://blog.csdn.net/donowtop/article/details/79839597