首页 > 代码库 > BackgroundWorker的简单用法
BackgroundWorker的简单用法
微软的官方例子
BackgroudWorker就是一个封装好的异步处理类(就是多线程,广泛用于winform开发中)
例子:
1.界面效果:
一个label,两个button
2.Form2.cs的代码
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace BackgroundWorkerTest 11 { 12 public partial class Form2 : Form 13 { 14 /* 15 * 使用BackgroundWorker的用法很多 16 * 1.可以直接从左边控件列表中拖一个到界面中 17 * 2.动态写代码生成,这里我是把它作为成员变量了 18 * **/ 19 private BackgroundWorker _worker = new BackgroundWorker(); 20 21 public Form2() 22 { 23 InitializeComponent(); 24 25 //设置是否允许报告进度 26 _worker.WorkerReportsProgress = true; 27 //设置是否允许取消 28 _worker.WorkerSupportsCancellation = true; 29 30 31 //BackgroundWorker的三个事件之一,异步处理是所要执行的动作 32 _worker.DoWork += new DoWorkEventHandler(_worker_DoWork); 33 34 //BackgroundWorker的三个事件之二,当进度改变时所要执行的动作 35 _worker.ProgressChanged += new ProgressChangedEventHandler(_worker_ProgressChanged); 36 37 //BackgroundWorker的三个事件之三,当任务正常完成或手动取消时,所要执行的动作 38 _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted); 39 } 40 41 42 //运行RunWorkerAsync()时就出发此方法,而且此方法不能与UI有交互,会抛异常 43 void _worker_DoWork(object sender, DoWorkEventArgs e) 44 { 45 //这个类是用来测试报告进度时,除了可以报告进度外,还可以返回一个object的变量 46 Person tommy = new Person("Tommy.Huang","25","CXY"); 47 48 for (int i = 1; i <= 100; i++) 49 { 50 //如果想要实现能够中途取消的功能,就必须在DoWork里面判断是否点击了取消 51 //CancellationPending用于判断是运行了CancelAsync()方法 52 if (_worker.CancellationPending) 53 { 54 e.Cancel = true; 55 break; 56 } 57 else 58 { 59 _worker.ReportProgress(i,tommy);//ReportProgress可以带1个或2个参数,第一个为进度int,第二个为object 60 //因为太快,看不到效果,所以让线程每一次暂停半秒 61 System.Threading.Thread.Sleep(100); 62 } 63 } 64 } 65 66 //当进度有所改变时,就会触发该方法,此方法可以与UI交互,所以通常在此方法中处理 67 void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 68 { 69 Person p = e.UserState as Person; 70 this.label1.Text = e.ProgressPercentage.ToString()+"% -"+p.Name; 71 } 72 73 //当异步线程正常运行结束,或者点击取消时都会执行此方法 74 void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 75 { 76 if (e.Cancelled) 77 System.Windows.Forms.MessageBox.Show("取消了"); 78 else 79 System.Windows.Forms.MessageBox.Show("完成了!"); 80 } 81 82 private void btnStart_Click(object sender, EventArgs e) 83 { 84 //需要先判断backgroundWorker是否正在运行 85 if (!_worker.IsBusy) 86 { 87 //RunWorkerAsync()启动线程 88 _worker.RunWorkerAsync(); 89 } 90 } 91 92 private void btnCancel_Click(object sender, EventArgs e) 93 { 94 //先判断backgroundWorker是否支持取消 95 if (_worker.WorkerSupportsCancellation) 96 { 97 //CancelAsync()取消线程 98 _worker.CancelAsync(); 99 }100 }101 102 }103 }
3.控件代码:Form2.Designer.cs
1 namespace BackgroundWorkerTest 2 { 3 partial class Form2 4 { 5 /// <summary> 6 /// Required designer variable. 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary>11 /// Clean up any resources being used.12 /// </summary>13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>14 protected override void Dispose(bool disposing)15 {16 if (disposing && (components != null))17 {18 components.Dispose();19 }20 base.Dispose(disposing);21 }22 23 #region Windows Form Designer generated code24 25 /// <summary>26 /// Required method for Designer support - do not modify27 /// the contents of this method with the code editor.28 /// </summary>29 private void InitializeComponent()30 {31 this.btnStart = new System.Windows.Forms.Button();32 this.btnCancel = new System.Windows.Forms.Button();33 this.label1 = new System.Windows.Forms.Label();34 this.SuspendLayout();35 // 36 // btnStart37 // 38 this.btnStart.Location = new System.Drawing.Point(42, 165);39 this.btnStart.Name = "btnStart";40 this.btnStart.Size = new System.Drawing.Size(75, 23);41 this.btnStart.TabIndex = 0;42 this.btnStart.Text = "开始";43 this.btnStart.UseVisualStyleBackColor = true;44 this.btnStart.Click += new System.EventHandler(this.btnStart_Click);45 // 46 // btnCancel47 // 48 this.btnCancel.Location = new System.Drawing.Point(249, 165);49 this.btnCancel.Name = "btnCancel";50 this.btnCancel.Size = new System.Drawing.Size(75, 23);51 this.btnCancel.TabIndex = 1;52 this.btnCancel.Text = "取消";53 this.btnCancel.UseVisualStyleBackColor = true;54 this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);55 // 56 // label157 // 58 this.label1.AutoSize = true;59 this.label1.Location = new System.Drawing.Point(61, 47);60 this.label1.Name = "label1";61 this.label1.Size = new System.Drawing.Size(35, 13);62 this.label1.TabIndex = 2;63 this.label1.Text = "label1";64 // 65 // Form266 // 67 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);68 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;69 this.ClientSize = new System.Drawing.Size(388, 230);70 this.Controls.Add(this.label1);71 this.Controls.Add(this.btnCancel);72 this.Controls.Add(this.btnStart);73 this.Name = "Form2";74 this.Text = "Form2";75 this.ResumeLayout(false);76 this.PerformLayout();77 78 }79 80 #endregion81 82 private System.Windows.Forms.Button btnStart;83 private System.Windows.Forms.Button btnCancel;84 private System.Windows.Forms.Label label1;85 }86 }
BackgroundWorker的简单用法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。