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 code
24
25         /// <summary>
26         /// Required method for Designer support - do not modify
27         /// 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             // btnStart
37             //
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             // btnCancel
47             //
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             // label1
57             //
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             // Form2
66             //
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         #endregion
81
82         private System.Windows.Forms.Button btnStart;
83         private System.Windows.Forms.Button btnCancel;
84         private System.Windows.Forms.Label label1;
85     }
86 }

时间: 2024-10-09 21:06:03

BackgroundWorker的简单用法的相关文章

wpf BackgroundWorker 的简单用法

1. 登陆中.. 登陆成功 BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (o, ea) => { Login(sName, sPassword); }; worker.RunWorkerCompleted += (o, ea) => { if (ea.Error != null) { tbMsg.Text = ea.Error.Message; Password.Clear(); Password.Foc

iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segmentfault.com/blog/alan/1190000002411296 iOS的各种动画相漂亮,相信这是吸引很多人买iPhone的原因之一.不仅如此,这还是吸引我做iOS开发的一大原因,因为在iOS上给界面实现一些像样的动画实在是太轻松了! 这里就介绍一下iOS的block-based an

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

Android中资源文件中的字符串数组string-array简单用法

在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的strings.xml文件里,或是其他自定义的xml中都可以,以下操作方法相同. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球<

expect简单用法

1 #!/usr/expect/bin/expect -f 2 3 4 set loginuser [lrange $argv 0 0] 5 set loginpass [lrange $argv 1 1] 6 set ipaddr [lrange $argv 2 2] 7 set port [lrange $argv 3 3] 8 set timeout [lrange $argv 4 4] 9 set from [lrange $argv 5 5] 10 set to [lrange $ar

Tcpdump 的简单用法

Tcpdump 的简单用法 tcpdump是Linux命令行下使用最广泛的网络分析工具,运行的时候会将网卡运行在混杂模式下,需要root权限才能执行 下面是几个比较常见的参数: -w  保持到指定的文件 -i  指定监听的网卡,缺省显示第一块网卡 -nn 以IP方式显示host -v  显示详细信息 -s  指定数据包大小,缺省是65535 -t  不显示时间 ,缺省是显示时间戳 -c  获取数据包数量,缺省不限制,需要用Ctrl+c来终止 下面是关于命令关键字的说明 1.主要包括host,ne

C++ double转string类型以及MFC控件简单用法

这两天项目需要,测试c++库里面内容.生成jar再给Android调用.我没有学过C++,现在开始记录C++简单用法.测试时候一般都是使用mfc程序来测试,要输入值,显示结果吗.我用的编译环境vs2008. 一.double 转string #include <string> CString strResultx; strResultx.Format(_T("x:%.4f\n"), 89.7887878); 转换结果还是放在strResultx 2.两个字符串相连 CStr

vB SendMessage API 简单用法

vB SendMessage API 简单用法 1. 在Windows编程中,向文本框控件.列表控件.按钮控件等是我们最常接触的控件了.但是在VB中这些控件有时无法实现我们的需要.在这时,我们只要简单的利用Windows API函数就可以扩充这些控件的功能了.顾名思义,SendMessage函数就是向窗口(这里的窗口指的是向按钮.列表框.编辑框等具有hWnd属性的控件)发送消息的函数,该函数的定义如下:Declare Function SendMessage Lib "user32"

java中Object.equals()简单用法

/* equals()方法默认的比较两个对象的引用! */ class Child { int num; public Child(int x){ num = x; } //人文的抛出运行时异常的好处是:可以自定义错误信息! /*public boolean equals(Object o) throws ClassCastException{ if(!(o instanceof Child)) throw new ClassCastException("中文提示:类型错误"); Ch